gpt4 book ai didi

c - 当我的子进程退出时,如何使用 signalfd 和 epoll 获取事件?

转载 作者:IT王子 更新时间:2023-10-29 00:40:33 25 4
gpt4 key购买 nike

我创建一个 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/

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