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

标签 linux unix crash pipe sigpipe

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

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

最佳答案

当接收器崩溃时,stdout 文件描述符似乎“准备好读取”:

$ 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

#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;
}

五秒内崩溃.c

#include <stdio.h>
#include <unistd.h>

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

我在 Linux 上试过这个,但不知道它是否能在其他地方工作。最好能找到一些解释这一观察结果的文档。

关于linux - 如何判断 Unix 管道中的下游进程是否已崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8073218/

相关文章:

Linux 高可用性与 Apache Hadoop

linux - 如果安装了 OpenStack,是否可以访问 Swift

c - C语言连接邮件服务器的方法

c++ - 我的代码可能会崩溃,因为 'class' 与 C 不兼容?

c# - 红X GUI 崩溃!我几乎放弃解决它!

android - 刚刚在 Mac 上更新到 Android Studio 4.2.1,现在模拟器不再工作

linux - 如何在设备树中配置ADC ad7266的多路复用器选择?

linux - 在我的 bash 脚本中使用 mkdir 并获得拒绝权限

regex - Bash 脚本中的正则表达式

c - 保存用户 ID 的目的