有什么方法可以通过pthread_kill()将数据传递给signalFd文件描述?

时间:2019-09-03 05:49:18

标签: signals epoll

这是情况的伪代码。为简洁起见,错误处理,变量的声明/定义被排除在外:

创建信号fd:

     sigset_t sigset;
     sigemptyset(&sigset);
     sigaddset(&sigset, SIGUSR2);
     sigprocmask(SIG_BLOCK, &sigset, NULL);
     mySignalFd = signalfd(-1, &sigset, 0);

然后,我创建一个epoll实例并按如下所示添加signalfd:

     epollSignalFd = epoll_create1(EPOLL_CLOEXEC);
     epollEventParam.events  = EPOLLIN | EPOLLOUT | EPOLLPRI | EPOLLERR | EPOLLHUP | EPOLLET | EPOLLONESHOT;
     epollEventParam.data.fd = epollSignalFd;
     epoll_ctl(epollSignalFd, EPOLL_CTL_ADD, mySignalFd, &epollEventParam);

最后是事件循环:

 while (1) {
       retStatus = epoll_wait(epollSignalFd, epollEventsReported, maxEvents, -1); 
       //signal handler code
  }

从另一个线程,我调用:

  pthread_kill(targetThreadId, SIGUSR2);

这会触发信号... epoll_wait()接收事件,在检查fd时,我知道它是epollSignalFd。

问题:如何将某些数据与信号一起传递给epoll_wait事件处理程序?对于常规文件描述符,可以执行read()或recv()来获取数据。在这里,对signalfd文件描述符的每次读取都返回信号事件,而不返回与该信号关联的任何数据。

每次触发信号(调用pthread_kill)时,我都想发送一些数据。我可以保留要填充的全局链接列表,在处理信号时可以访问该列表,但是有没有更直接的方法?

0 个答案:

没有答案