0

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

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

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

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

4

3 回答 3

3

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

无论如何感谢您的帮助。

于 2010-01-10T03:56:08.337 回答
0

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

于 2010-01-10T03:11:48.457 回答
0

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

于 2010-01-10T03:14:49.987 回答