2014-02-14 17 views
1

我在写terminal logging program - 认为script命令,但有点更多的功能。其中一个区别是,script将stdout,stdin和stderr捕获为一个大字符流,我想将它们分开并记录它们。过程连接到stdout和stderr单独的pty

为了做到这一点,我使用标准方法运行连接到一个pty的子shell,而不是使用一个单一的标准输入与标准输入,标准输出和标准错误都连接到它,我使用两个ptys - 与标准输入和stderr连接到一个pty,并在另一个stdout。通过这种方式,主进程可以告诉来自标准输出和来自标准错误的内容。

到目前为止,这已经工作得很好。但是,我开始遇到一些问题。例如,尝试设置列数的时候,我得到如下:

$ stty的的cols 169

的stty:stdout中出现重定向,但标准输入是控制描述符

这似乎是this piece of code的结果,这似乎检查stdout和stderr是否都是ttys,但是如果它们不相同则会投诉。

因此,我的问题是:我违反了关于Posix过程如何以这种方式行为的基本假设?如果没有,任何想法为什么我看到这样的错误?如果是这样,有什么办法可以解决这个问题,仍然可以很好地分离stdout和stderr吗?

+0

是的,我认为这也是一个好主意。我可能会尝试一下,但我想我会放弃它 - 太不标准了,因为你发现了......这就是我想出来的(single pty)https://github.com/ioquatix/ script-runner/blob/master/lib/script-wrapper.py – ioquatix

+0

我也试图做同样的事情,但由于这个问题没有任何运气。也许答案是用两个具有相同文件描述符的管道产生进程,然后一旦它开始输出,将stderr文件描述符更改为另一个pty? –

+0

你们中的任何一个好人都会弄明白这一点吗? – hornairs

回答

1

我想到的一个想法是直接在pty上使用一个进程,然后运行目标程序,例如,

(wrapper) -> pty -> (controller) -> script 

控制器将负责运行脚本和捕获stdoutstderr分开,喂养它们回包装,或许是一些非-STD FD,或者把它运回之前连载的数据,例如前缀stderr的输出与stderr:stdoutstdout: - 然后在包装中反序列化并将其反馈到上游或任何你想用它做的事情。