gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:09:16 24 4
gpt4 key购买 nike

我正在写一个 terminal logging program - 想想 script 命令,但功能更强大。其中一个区别是,虽然 script 将 stdout、stdin 和 stderr 捕获为一个大字符流,但我想将它们分开并记录下来。

为了做到这一点,我使用了运行一个连接到 pty 的子 shell 的标准方法,但是我没有使用一个 pty 与 stdin、stdout 和 stderr 都连接到它,我使用了两个 ptys - stdin 和stderr 连接到一个 pty,stdout 连接到另一个 pty。这样,主进程就可以分辨出什么来自 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

Controller 将负责运行脚本并分别捕获 stdoutstderr,将它们反馈给包装器,可能是通过一些非 std fd,或者或者,在将数据运回之前序列化数据,例如为 stderr 的输出加上 stderr:stdout 的前缀 stdout: - 然后在包装器中反序列化它并提供它返回上游或任何你想用它做的事。

关于linux - 连接到单独 pty 的进程用于 stdout 和 stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21778850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com