我想知道是否可以重定向ECL的Linux stdio,以便它不会与其嵌入的应用程序共享流。
我的问题是主机应用程序为了自己的目的接管了stdin,stdout和stderr。所以,我希望有一个单独的控制台来控制lisp噪音,并在SLIME / SWANK崩溃回到顶层时进行恢复。目前,SWANK打嗝将CL-USER>
提示添加到应用程序调试日志中,重定向了C opperation (read) signalled an error
stdout的失败,并且stdin最有可能被父进程关闭或使用。
我知道您可以setf *standand-output*
等新流,但我还没有找到一种方法来连接终端,例如屏幕或xterm或套接字。我需要底层的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,但似乎还有办法获得真正的流。我想这将需要一些研究来弄清楚SWANK如何做到这一点。哦,方便的高价!
我的错误。没有*standard-error*
,只有*error-output*
。你能说我对Lisp很新吗?
现在,所有内容都被重定向。然而,SLIME现在没有和SWANK谈过,在某种程度上打败了这个目的......
胜利!在连接SLIME之前,您需要在终端中运行类似此shell脚本的内容来创建顶级shell:
tail -f stdout-fifo &
tail -f stderr-fifo &
cat - >> stdin-fifo
原因,我无法猜测。但幸运的是它无论如何都有效。
我确信有人可以创建一个套接字服务器或屏幕分离的PTY,无论是否有人正在观看它们,都可以保持流的快乐。那将是一个更加优雅的解决方案。