我有一个Linux进程(我们称它为主进程),它的标准输出通过shell的管道操作符(|)输送到另一个进程(称为下游进程)。主进程被设置为在下游进程崩溃时接收SIGPIPE信号。不幸的是,在主进程写入stdout之前,不会引发SIGPIPE。有没有办法更快地告诉我们下游进程已经终止了?
一种方法是连续写入下游流程,但这似乎是浪费。另一种方法是有一个单独的监视器进程来监视所有相关的进程,但这很复杂。或者,也许有一些方法可以使用select()来触发信号。我希望主进程可以自己完成所有这些工作。
发布于 2011-11-10 11:12:16
当接收器崩溃时,标准输出文件描述符将变为“可供读取”:
$ 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;
}
crash-in-five-seconds.c
#include <stdio.h>
#include <unistd.h>
int main(void)
{
sleep(5);
putchar(*(char*)NULL);
return 0;
}
我在Linux上尝试过,但不知道在其他地方是否也能正常工作。如果能找到一些文档来解释这一观察结果,那就太好了。
发布于 2011-11-10 08:10:18
如果主进程退出(fork
)其他进程,那么当其他进程退出时,它将收到SIGCHLD
通知。
https://stackoverflow.com/questions/8073218
复制相似问题