我创建一个 sigset_t
并将其设置为空,然后向其添加 SIGCHLD
,然后将其设置为 BLOCK
:
sigset_t sigmask;
sigemptyset (&sigmask);
sigprocmask (SIG_BLOCK, &sigmask, NULL);
然后通过signalfd4()
创建一个signalfd
int signalfd = signalfd4 (-1, &sigmask, sizeof(sigset_t), SFD_NONBLOCK);
然后添加到之前创建的epollfd中:
struct epoll_event epev;
memset (&epev, 0, sizeof(struct epoll_event));
epev.events = POLLIN;
int retval = epoll_ctl (epollfd, EPOLL_CTL_ADD, signalfd, &epev);
retval为0;
最后,我使用 epoll_wait(epollfd, ...)
等待我的子进程,它由 fork() 关心并休眠 2 秒,什么都不做,然后退出,但没有任何返回。
任何人请给我一些帮助吗?谢谢!
最佳答案
在设置好信号和信号 fd 后,我发现以下方法有效:
epev.fd = sigfd; // sigfd if from signalfd, need to remember it
pid_t me = getpid();
fork();
对于家长:
if ( me == getpid() ) {
// parent
while ( 1 ) { // loop of epoll_wait
retval = epoll_wait ( epollfd, &epev, 1, -1 );
如果这是信号,fd 读取它以找出发送的是哪个信号。
if ( epev.data.fd == sigfd ) {
struct signalfd_siginfo si;
while ( 1 ) {
int nr = read ( sigfd, &si, sizeof si );
if ( nr != sizeof si ) {
break; // done reading from the signal fd
}
if ( si.ssi_signo == SIGCHLD ) {
在收到 SIGCHILD 时做 parent 需要做的事情
} else {
一些其他信号
}
}
}
}
} else {
// child
子代码
关于c - 当我的子进程退出时,如何使用 signalfd 和 epoll 获取事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25607579/