我正在写一个terminal logging program-想想脚本命令,但是功能更多一些.差异之一是,尽管脚本将stdout,stdin和stderr捕获为一个大字符流,但我想将它们分开并记录下来.
为此,我使用运行连接到pty的子shell的标准方法,但不是使用单个pty与stdin,stdout和stderr都连接到它,而是使用两个pty-将stdin和stderr连接到一个pty,另一个则是stdout.这样,主进程可以分辨出来自stdout的东西和来自stderr的东西.
到目前为止,这种方法运行良好.但是,我开始遇到一些问题.例如,当尝试设置列数时,得到以下信息:
$stty cols 169
stty: stdout appears redirected, but stdin is the control descriptor
这似乎是this piece of code的结果,它似乎在检查stdout和stderr是否都是ttys,但会抱怨它们是否不相同.
因此,我的问题是:我是否违反了有关以这种方式执行Posix进程行为的任何基本假设?如果没有,我为什么会看到这样的错误?如果是这样,我有什么办法可以解决这个问题,并且仍然可以很好地将stdout和stderr分开?
解决方法:
我对此的一个想法是直接在pty上使用一个进程,然后运行目标程序,例如
(wrapper) -> pty -> (controller) -> script
控制器将负责运行脚本并分别捕获stdout和stderr,也许通过一些非std fd将它们反馈回包装器,或者替代性地将数据序列化之后再运回.在stderr的输出前加上stderr:前缀,在stdout上加上stdout ::-然后在包装器中反序列化它,并将其反馈回上游或您想对其进行任何处理.