管道未接收来自子进程的所有输出

时间:2010-01-10 02:48:21

标签: c unix pipe execv

我想打开一个程序管道并从中读取输出。我最初的倾向是使用popen(),但程序需要很多选项,而不是使用shell引用/转义,我决定使用pipe(),fork(),dup()的组合来绑定管道的末端到父/子的stdin / stdout,而execv()用程序的调用替换子程序,传递了它期望作为数组的所有选项。

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

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

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

3 个答案:

答案 0 :(得分:2)

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

无论如何,谢谢你的帮助。

答案 1 :(得分:0)

不确定,linux上有一个名为posix_spawn的酷函数(例如http://www.opengroup.org/onlinepubs/000095399/xrat/xsh_chap03.html#tag_03_03_01_02})有时它会使管道更容易......但听起来像是一个可能的阻塞问题或管道...... ..

答案 2 :(得分:0)

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