我正在写一个terminal logging program - 想一下script
命令,但有点特色。其中一个不同之处在于,script
将stdout,stdin和stderr捕获为一个大字符流,我想将它们分开并记录下来。
为了做到这一点,我使用运行连接到pty的子shell的标准方法,但是不使用stdin,stdout和stderr连接到它的单个pty,我使用两个ptys - 使用stdin和stderr连接到一个pty,stdout连接到另一个。这样,主进程可以告诉stdout的内容以及来自stderr的内容。
到目前为止,这已经很好了。但是,我开始遇到一些问题。例如,在尝试设置列数时,我得到以下内容:$ stty cols 169
stty:stdout出现重定向,但stdin是控制描述符
这似乎是this piece of code的结果,它似乎检查stdout和stderr是否都是ttys,但是抱怨它们是不一样的。
因此,我的问题是:我是否违反了关于Posix过程如何以这种方式行事的基本假设?如果没有,任何想法为什么我看到这样的错误?如果是这样,有什么方法可以解决这个问题,并且仍然能够很好地分离stdout和stderr吗?
答案 0 :(得分:3)
我对此有一个想法是直接在pty上使用一个进程,然后运行目标程序,例如
(wrapper) -> pty -> (controller) -> script
控制器将负责运行脚本并分别捕获stdout
和stderr
,将它们反馈到包装器,可能是通过某些非标准fd,或者在将数据序列化之前运回来,例如将stderr
与stderr:
和stdout
的输出加前缀stdout:
- 然后在包装器中对其进行反序列化并将其反馈到上游或者您要对其执行的操作。