我想知道是否可以重定向 ECL 的 Linux stdio,使其不与嵌入的应用程序共享流。
我的问题是主机应用程序出于自己的目的接管了标准输入、标准输出和标准错误。所以,我想有一个单独的控制台来处理 lisp 噪音,并在 SLIME/SWANK 崩溃回到顶层时进行恢复。目前 SWANK hiccups 将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 是如何做到的。哦,便利的高价!
更新 2
我的错。没有*standard-error*
,只有*error-output*
。你能告诉我我对 Lisp 很陌生吗?
现在,一切都被重定向了。不过,SLIME 现在不会和 SWANK 说话了,有点违背了目的……
更新 3
胜利!在连接 SLIME 之前,您需要在终端中运行类似以下的 shell 脚本来创建您的顶级 shell:
tail -f stdout-fifo &
tail -f stderr-fifo &
cat - >> stdin-fifo
原因,我猜不出来。但幸运的是它仍然有效。
顺便说一句,不要阻止任何想要发布更好答案的人
我确信有人可以制作一个套接字服务器或屏幕分离的 PTY,无论是否有人在看它们,都可以让流保持快乐。那将是一个更经典的解决方案。