【问题标题】:Process connected to separate pty for stdout and stderr连接到 stdout 和 stderr 的单独 pty 的进程
【发布时间】:2014-03-13 18:49:03
【问题描述】:

我正在写一个terminal logging program - 想想script 命令,但它更有特色。不同之处之一是,虽然script 将标准输出、标准输入和标准错误捕获为一个大字符流,但我想将它们分开并记录下来。

为了做到这一点,我使用标准方法运行连接到 pty 的子 shell,但我没有使用单个 pty 与 stdin、stdout 和 stderr 都连接到它,而是使用两个 pty - 与 stdin 和stderr 连接到一个 pty,而 stdout 连接到另一个。这样,主进程就可以分辨出来自 stdout 和来自 stderr 的内容。

到目前为止,这一切都很好。但是,我开始遇到一些问题。例如,当尝试设置列数时,我得到以下信息:

$stty cols 169

stty: stdout 出现重定向,但 stdin 是控制描述符

这似乎是this piece of code的结果,它似乎检查stdout和stderr是否都是tty,但如果它们不一样就会抱怨。

因此,我的问题是:我是否违反了关于 Posix 进程如何以这种方式运行的任何基本假设?如果没有,知道为什么我会看到这样的错误吗?如果是这样,有什么办法可以解决这个问题,并且仍然可以很好地分离 stdout 和 stderr?

【问题讨论】:

  • 是的,我认为这也是一个好主意。我可能会尝试一下,但我想我会放弃它 - 正如你所发现的那样太不标准了。这是我想出的(单个 pty)github.com/ioquatix/script-runner/blob/master/lib/…
  • 我也在尝试做同样的事情,但由于这个问题没有任何运气。也许答案是使用具有相同文件描述符的两个管道生成进程,然后一旦它开始提供输出,就将 stderr 文件描述符更改为另一个 pty?
  • 你们中的任何人都知道这个吗?

标签: linux posix pty


【解决方案1】:

我对此的一个想法是直接在 pty 上使用一个进程,然后运行目标程序,例如

(wrapper) -> pty -> (controller) -> script

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

【讨论】:

  • @Keelan 我确实取得了一些成功,但最终为了我的特殊用途放弃了这种方法。
猜你喜欢
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2011-07-07
  • 2020-06-23
  • 1970-01-01
相关资源
最近更新 更多