如何将* standard-input *和* standard-output *重定向到另一个PTY,FIFO或套接字?

时间:2017-01-09 19:13:47

标签: common-lisp slime swank ecl

我想知道是否可以重定向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如何做到这一点。哦,方便的高价!

更新2

我的错误。没有*standard-error*,只有*error-output*。你能说我对Lisp很新吗?

现在,所有内容都被重定向。然而,SLIME现在没有和SWANK谈过,在某种程度上打败了这个目的......

更新3

胜利!在连接SLIME之前,您需要在终端中运行类似此shell脚本的内容来创建顶级shell:

tail -f stdout-fifo &
tail -f stderr-fifo &
cat - >> stdin-fifo

原因,我无法猜测。但幸运的是它无论如何都有效。

,不要劝阻任何想要发表更好答案的人

我确信有人可以创建一个套接字服务器或屏幕分离的PTY,无论是否有人正在观看它们,都可以保持流的快乐。那将是一个更加优雅的解决方案。

0 个答案:

没有答案