我想了解分叉信号的行为。我编写了一个小程序来用epoll_wait捕获SIGCHLD,但是当我对派生的孩子执行“ kill -9”操作时,我没有收到任何信号,并且孩子处于失效状态(我有一个处理程序,它执行wait()) 。
这是代码。
//....
sigemptyset(&mask);
sigaddset(&mask, SIGCHLD);
pthread_sigmask(SIG_BLOCK, &mask, NULL);
signal_fd = signalfd(-1, &mask, 0);
memset(&tev, 0, sizeof(tev));
tev.events = EPOLLIN | EPOLLONESHOT;
tev.data.fd = signal_fd;
epoll_ctl(efd_, EPOLL_CTL_MOD, signal_fd, &tev);
while (1) {
child_pid_ = fork();
if (child_pid_ == 0) {
close(signal_fd);
close(efd_);
make_grand_child(); //just sleeps in while(1) and never returns.
} else {
memset(&event, 0, sizeof(event));
while (1) {
epoll_wait(efd_, &event, 1, -1);
deliver_events = (event.events & EPOLLERR|EPOLLHUP|EPOLLIN|EPOLLONESHOT);
if (deliver_events) {
parent_sig_handler(SIGCHLD);
break;
}
}
}
}
更新:
使用EPOLL_CTL_MOD而不先进行添加(EPOLL_CTL_ADD)。在我更改了它之后,它就像是一种魅力。
最佳答案
SIGCHLD的默认配置将被忽略。阻塞信号不会改变其处置,只会给signalfd
同步处理它的机会。
使用signal
或sigaction
为SIGCHLD添加信号处理程序。它不需要执行任何操作,因为它不会被执行。由于SIGCHLD被阻止,因此signalfd
将在处理程序之前使用并处理它。
关于c - SIGCHLD没有陷入epoll_wait吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24153807/