3

我想知道是否可以重定向 ECL 的 Linux stdio,使其不与嵌入的应用程序共享流。

我的问题是主机应用程序出于自己的目的接管了标准输入、标准输出和标准错误。所以,我想有一个单独的控制台来处理 lisp 噪音,并在 SLIME/SWANK 崩溃回到顶层时进行恢复。目前 SWANK hiccups 将CL-USER> 提示放入应用程序调试日志中,C opperation (read) signalled an errorstdout 的失败被重定向,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,无论是否有人在看它们,都可以让流保持快乐。那将是一个更经典的解决方案。

4

0 回答 0