我正在编写一个终端日志程序- 想想这个script命令,但功能更强大。区别之一是,虽然script将 stdout、stdin 和 stderr 捕获为一个大字符流,但我希望将它们分开并按原样记录。
为了做到这一点,我使用了运行连接到 pty 的子 shell 的标准方法,但我使用了两个 pty——stdin 和 stderr 连接到了两个 pty,而不是使用一个带有 stdin、stdout 和 stderr 的单个 pty。一个 pty,另一个是标准输出。这样,主进程就可以分辨出什么来自 stdout,什么来自 stderr。
到目前为止,这运行良好。但是,我开始遇到一些问题。例如,当尝试设置列数时,我得到以下信息:
$stty cols 169
stty:stdout 出现重定向,但 stdin 是控制描述符
这似乎是这段代码的结果,它似乎检查 stdout 和 stderr 是否都是 ttys,但如果它们不一样就会抱怨。
因此,我的问题是:我是否违反了关于 Posix 进程如何以这种方式行事的任何基本假设?如果没有,知道为什么我会看到这样的错误吗?如果是这样,有什么办法可以解决这个问题,并且仍然设法很好地分离 stdout 和 stderr?
我对此的一个想法是直接在 pty 上使用一个进程,然后运行目标程序,例如
(wrapper) -> pty -> (controller) -> script
Run Code Online (Sandbox Code Playgroud)
控制器将负责运行脚本并分别捕获stdout和stderr,将它们反馈给包装器(可能是通过一些非标准的 fd ),或者在将数据传回之前序列化数据,例如,在stderrwithstderr:和stdoutwith的输出前添加前缀stdout:- 然后在包装器中反序列化它并将其反馈回上游或任何你想用它做的事情。
| 归档时间: |
|
| 查看次数: |
1143 次 |
| 最近记录: |