首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何判断Unix管道中的下游进程是否已崩溃

如何判断Unix管道中的下游进程是否已崩溃
EN

Stack Overflow用户
提问于 2011-11-10 07:31:38
回答 2查看 375关注 0票数 1

我有一个Linux进程(我们称它为主进程),它的标准输出通过shell的管道操作符(|)输送到另一个进程(称为下游进程)。主进程被设置为在下游进程崩溃时接收SIGPIPE信号。不幸的是,在主进程写入stdout之前,不会引发SIGPIPE。有没有办法更快地告诉我们下游进程已经终止了?

一种方法是连续写入下游流程,但这似乎是浪费。另一种方法是有一个单独的监视器进程来监视所有相关的进程,但这很复杂。或者,也许有一些方法可以使用select()来触发信号。我希望主进程可以自己完成所有这些工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-10 11:12:16

当接收器崩溃时,标准输出文件描述符将变为“可供读取”:

代码语言:javascript
运行
复制
$ gcc -Wall select-downstream-crash.c -o select-downstream-crash
$ gcc -Wall crash-in-five-seconds.c -o crash-in-five-seconds
$ ./select-downstream-crash | ./crash-in-five-seconds
    ... five seconds pass ...
stdout is ready for reading
Segmentation fault

select-downstream-crash.c

代码语言:javascript
运行
复制
#include <err.h>
#include <stdio.h>
#include <sys/select.h>
#include <unistd.h>

int main(void)
{
    fd_set readfds;
    int rc;

    FD_ZERO(&readfds);
    FD_SET(STDOUT_FILENO, &readfds);

    rc = select(STDOUT_FILENO + 1, &readfds, NULL, NULL, NULL);
    if (rc < 0)
        err(1, "select");

    if (FD_ISSET(STDOUT_FILENO, &readfds))
        fprintf(stderr, "stdout is ready for reading\n");

    return 0;
}

crash-in-five-seconds.c

代码语言:javascript
运行
复制
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    sleep(5);
    putchar(*(char*)NULL);
    return 0;
}

我在Linux上尝试过,但不知道在其他地方是否也能正常工作。如果能找到一些文档来解释这一观察结果,那就太好了。

票数 3
EN

Stack Overflow用户

发布于 2011-11-10 08:10:18

如果主进程退出(fork)其他进程,那么当其他进程退出时,它将收到SIGCHLD通知。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8073218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档