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

标签 c linux io signals epoll

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

相关文章:

io - 使用 javax.smartcardio 从智能卡读取序列号

apache-spark - Spark 抛出 java.io.IOException : Failed to rename when saving part-xxxxx. gz

c - 局部变量声明放置所需的 Microsoft C/C++ 编译器开关

c - 如何在 C 中使用 printf 遍历 unicode 字符并将它们打印在屏幕上?

linux - 使用每个 "compress, gzip, bzip2 and zip"压缩和解压缩文件

linux - Git pull --all 在 osx/linux 上表现不同

c - bignum 库和素性测试算法的方便基础是什么?

Kali Linux VM 中的 C 段错误

c - pthread_mutex_t 位于结构体内部并在访问时锁定该结构体

java - JAVA中flush()和reset()的区别