distinguish stdout from stderr on pipe
所以,与上面的链接相关,我有一个孩子正在执行tail
,而且父母正在通过pipe
读取其输出。
dup2(pipefd[1], STDOUT_FILENO);
dup2(pipefd[1], STDERR_FILENO);
我的问题是,如果tail
以某种方式失败,我正在阅读的管道会发生什么?我在stderr
得到了什么吗? tail
会自行终止吗?或者它可以挂在那里defunct
?
答案 0 :(得分:2)
当SIGPIPE
终止时,内核将向管道上的其他进程发送tail
信号。此信号的默认操作(如果未安装处理程序)是终止进程。
如果您不想处理信号,可以忽略父级中的SIGPIPE
(因此当tail
终止时它不会终止),而是检查{的值是否为{每个errno
后{1}}为EPIPE
。此外,您必须从父母处拨打read
或wait
以收获僵尸孩子。
答案 1 :(得分:1)
您在阅读时没有获得EPIPE,只有写入才会返回EPIPE。您将获得EOF,由读取返回0表示,并且由于您读取了stderr,您也会收到错误消息(在EOF之前)。
该过程将变为僵尸,您可以使用wait / waitpid获取退出状态,如果出现错误,该状态将为非零。
答案 2 :(得分:1)
如果尾部失败,管道读取端的任何读取都将返回EOF。如果tail失败,它已经终止,“失败”的定义是它以非零退出状态终止。它将保留在流程表中(即“解散”),直到父级等待它。
但是你为什么要为stderr和stdout使用相同的管道呢?为什么不做两个管道?这似乎可以消除区分两个输出流的问题。