这是情况的伪代码。为简洁起见,错误处理,变量的声明/定义被排除在外:
创建信号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)时,我都想发送一些数据。我可以保留要填充的全局链接列表,在处理信号时可以访问该列表,但是有没有更直接的方法?