Common lisp 如何将*标准输入*和*标准输出*重定向到其他PTY、FIFO或套接字?

Common lisp 如何将*标准输入*和*标准输出*重定向到其他PTY、FIFO或套接字?,common-lisp,slime,swank,ecl,Common Lisp,Slime,Swank,Ecl,我想知道是否有可能重定向ECL的Linux stdio,这样它就不会与嵌入它的应用程序共享流 我的问题是,主机应用程序出于自己的目的接管了stdin、stdout和stderr。所以,我想有一个单独的控制台,用于lisp噪音和恢复当SLIME/SWANK崩溃回到顶级时。目前,SWANK hiccups将CL-USER>提示放入应用程序调试日志,操作失败(读取)表示出现错误,stdout被重定向,stdin很可能已关闭或由父进程使用 我知道你可以setf*standand*output*,等等到一

我想知道是否有可能重定向ECL的Linux stdio,这样它就不会与嵌入它的应用程序共享流

我的问题是,主机应用程序出于自己的目的接管了stdin、stdout和stderr。所以,我想有一个单独的控制台,用于lisp噪音和恢复当SLIME/SWANK崩溃回到顶级时。目前,SWANK hiccups将
CL-USER>
提示放入应用程序调试日志,操作失败(读取)表示出现错误,stdout被重定向,stdin很可能已关闭或由父进程使用

我知道你可以
setf*standand*output*
,等等到一个新的流,但是我还没有找到一种方法来连接终端,比如screen、xterm或socket。我需要底层的Linux/C文件描述符,然后我可以做一个PTY

如果有办法将标准流连接到我可以使用telnet连接的套接字服务器,那就更好了

更新 根据评论中的建议,我尝试了以下代码:

(loop for filename in '("stdin-fifo" "stdout-fifo" "stderr-fifo") do
  (let (
        (truename (probe-file filename)))
    (if truename  nil
                       (ext:run-program "/usr/bin/mkfifo" (list filename)))))

(setf *standard-output*
      (open (probe-file "stdout-fifo") :direction :output :if-exists :overwrite))
(setf *error-output*
      (open (probe-file "stderr-fifo") :direction :output :if-exists :overwrite))
(setf *standard-input*
      (open (probe-file "stdin-fifo") :direction :input))
这不太管用。问题是,虽然一些IO被重定向到SWANK,但似乎仍然有办法获得真正的流。我想需要一些研究来弄清楚斯旺克是如何做到这一点的。哦,方便的高价

更新2 我的错误。没有
*标准错误*
,只有
*错误输出*
。你能告诉我我对Lisp很陌生吗

现在,一切都被重定向了。然而,SLIME现在不会和SWANK说话,这在某种程度上违背了目的

更新3 胜利!在连接SLIME之前,您需要在终端中运行类似以下shell脚本的操作,以创建顶级shell:

tail -f stdout-fifo &
tail -f stderr-fifo &
cat - >> stdin-fifo
我猜不出原因。但幸运的是,它无论如何都能工作

顺便说一句,不要阻止任何想发布更好答案的人
我相信有人可以制作一个套接字服务器或屏幕分离PTY,无论是否有人在观看,都可以让流保持愉快。这将是一个更为经典的解决方案。

可能有兴趣:(c_stream_to_lisp_stream)您可以打开
/dev/fd/##
来访问打开的fd,就像它是一个文件一样。如果您没有连接到控制接口(例如telnet),代码应该阻塞、发出错误信号,还是静默地继续?如果您想阻止,也许打开FIFO是最简单的方法?谢谢,@coredump帮助我了解了
从fd生成流
,这是一种未记录的方法,如果我选择PTY路线,它将非常有用。@MichaelFox它依赖于操作系统,但简短的回答是“感谢Linux内核”。