【问题标题】:Pipe is not receiving all output from child process管道没有接收到子进程的所有输出
【发布时间】:2010-01-10 02:48:20
【问题描述】:

我想打开一个通往程序的管道并从中读取输出。我最初的倾向是使用 popen(),但该程序有许多选项,而不是与 shell 引用/转义作斗争,我决定使用 pipe()、fork()、dup() 的组合来绑定到父/子中的标准输入/标准输出的管道末端,以及用程序调用替换子的 execv() 传递了它期望作为数组的所有选项。

程序输出多行数据(并在每行之后刷新标准输出)。父代码将 stdin 设置为非阻塞,并使用 fgets() 在循环中从中读取。当 fgets() 返回非 NULL 或标准输入有 EAGAIN 或 EWOULDBLOCK 错误条件时循环运行。

它成功接收了大部分行,但到最后它似乎下降了,最后一个 fgets() 失败并出现“没有这样的文件或目录”的奇怪错误。

有谁知道我在这里做错了什么?

【问题讨论】:

  • 我认为您将不得不为此发布一些代码。

标签: c unix pipe execv


【解决方案1】:

我发现了问题。我愚蠢地没有在每次迭代时将 errno 重置为零。我想我只是假设 fgets() 会处理它或其他什么......我的愚蠢错误。现在它工作正常。总是重置 errno!

无论如何感谢您的帮助。

【讨论】:

    【解决方案2】:

    不确定,Linux 上有一个很酷的功能,叫做 posix_spawn(此处为 http://www.opengroup.org/onlinepubs/000095399/xrat/xsh_chap03.html#tag_03_03_01_02),有时它可以让管道变得更容易......但听起来可能是阻塞问题或管道......

    【讨论】:

      【解决方案3】:

      确保您打开了通往 STDERR 的管道。大多数程序在那里写入错误数据而不是 STDIN。

      【讨论】:

        猜你喜欢
        • 2021-09-03
        • 1970-01-01
        • 1970-01-01
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 2014-11-02
        相关资源
        最近更新 更多