如果从管道读取时尾部失败怎么办?

时间:2011-08-12 21:49:05

标签: c unix pipe stderr tail

distinguish stdout from stderr on pipe

所以,与上面的链接相关,我有一个孩子正在执行tail,而且父母正在通过pipe读取其输出。

dup2(pipefd[1], STDOUT_FILENO);
dup2(pipefd[1], STDERR_FILENO);

我的问题是,如果tail以某种方式失败,我正在阅读的管道会发生什么?我在stderr得到了什么吗? tail会自行终止吗?或者它可以挂在那里defunct

3 个答案:

答案 0 :(得分:2)

SIGPIPE终止时,内核将向管道上的其他进程发送tail信号。此信号的默认操作(如果未安装处理程序)是终止进程。

如果您不想处理信号,可以忽略父级中的SIGPIPE(因此当tail终止时它不会终止),而是检查{的值是否为{每个errno后{1}}为EPIPE。此外,您必须从父母处拨打readwait以收获僵尸孩子。

答案 1 :(得分:1)

您在阅读时没有获得EPIPE,只有写入才会返回EPIPE。您将获得EOF,由读取返回0表示,并且由于您读取了stderr,您也会收到错误消息(在EOF之前)。

该过程将变为僵尸,您可以使用wait / waitpid获取退出状态,如果出现错误,该状态将为非零。

答案 2 :(得分:1)

如果尾部失败,管道读取端的任何读取都将返回EOF。如果tail失败,它已经终止,“失败”的定义是它以非零退出状态终止。它将保留在流程表中(即“解散”),直到父级等待它。

但是你为什么要为stderr和stdout使用相同的管道呢?为什么不做两个管道?这似乎可以消除区分两个输出流的问题。