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

标签 linux posix pty

我正在写一个 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/

相关文章:

c - pthread 条件信号与 POSIX 实时信号相同还是不同?

c++ - 当调用 forkpty 时,X 会抛出错误。 (C++)

ruby - 我如何使 stdin 成为 tty?

c++ - 在 linux 上接受时相同的 SOCKET id?

linux - 遍历目录中的文件,创建输出文件,linux

linux - Chrome 不能播放 MP4

c - 告诉伪终端的从端口名称

python - 是否可以在套接字监听器上跟踪丢失的连接?

sockets - 为什么我的套接字程序中会出现绑定(bind)错误?是因为我没有正确关闭套接字吗?

sockets - 哪些 Posix 套接字错误可以恢复?