【问题标题】:Reading child process' output as soon as some is available?一旦有一些可用就读取子进程的输出?
【发布时间】:2010-08-01 15:05:35
【问题描述】:

我一直在尝试各种方法(popen、管道 + fork/exec、...)来读取子进程的输出,所有这些方法都在工作,但表现出相同的行为:每当我尝试读取输出时使用read/fread,它只在缓冲区完全填满或子退出时返回。我正在寻找一种更像套接字的行为:只要有一些数据可用就读取任意数量的数据。

我该怎么做?

【问题讨论】:

  • 正如其他人所说,您必须更改子进程以将子进程缓冲区刷新到此。子进程是标准的 Unix 实用程序还是您可以访问其源代码的东西?

标签: c linux process pipe redirect


【解决方案1】:

通常你不会。特别是,子进程将缓冲流,因为它不会将连接到管道的流视为“交互式”。由于缓冲发生在子进程内部,因此防止它的唯一方法是重写子进程中的代码以防止它缓冲其标准输出(无论是曾经,还是在传递特定开关时,或者您可以添加代码检测它何时连接到管道并仅在特定情况下关闭缓冲)。但是,如果它向标准输出写入大量内容,则可能会影响孩子的表现(尤其是如果您对何时禁用缓冲没有选择性)。

【讨论】:

  • 如果您不能修改子程序,您可以通过将其连接到由scriptexpect、emacs、等
  • 吉尔斯的想法是正确的。您只需要设置一个 pty 来代替管道,然后被调用程序的 stdout 将默认为行缓冲模式。
  • @Gilles: ..或者你可以自己创建一个伪终端对并将孩子连接到它(使用posix_openpt()和相关函数)。
【解决方案2】:

我认为这是不可能的。缓冲是在孩子这边处理的,如果它不刷新它的缓冲区,那么你就没有什么可以读的了。但是,一些工具具有命令行选项来控制缓冲,例如grep --line-buffered.

【讨论】:

    猜你喜欢
    • 2013-03-12
    • 2014-08-28
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多