gpt4 book ai didi

c - SIGCHLD 没有被 epoll_wait 捕获?

转载 作者:行者123 更新时间:2023-11-30 17:32:26 24 4
gpt4 key购买 nike

我想了解 fork 上信号的行为。我编写了一个小程序来使用 epoll_wait 捕获 SIGCHLD 但是当我对 fork 的子进程执行“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 提供同步处理信号的机会。

使用signalsigaction为SIGCHLD添加信号处理程序。它不必执行任何操作,因为它不会被执行。由于 SIGCHLD 被阻止,signalfd 将在处理程序之前使用并处理它。

关于c - SIGCHLD 没有被 epoll_wait 捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24153807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com