linux-连接到用于stdout和stderr的单独的pty的进程

我正在写一个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 ::-然后在包装器中反序列化它,并将其反馈回上游或您想对其进行任何处理.

上一篇:MongoDB解压安装


下一篇:CLIon 终端输出中文乱码解决 不用右下角改GBK