C++ 确定哪个信号导致EINTR?

C++ 确定哪个信号导致EINTR?,c++,c,signals,epoll,gperf,C++,C,Signals,Epoll,Gperf,我正在运行一个epoll循环,有时我对epoll_wait的调用返回-1,errno设置为EINTR。有时,我希望这可以结束epoll循环,比如SIGTERM或SIGINT。但是我用-pg标志编译了这段代码,所以周期性的SIGPROF(27)信号被触发,从而停止我的循环 所以。。。是否可以打开signum,以便确定何时退出或继续?我希望避免使用全局函数跟踪最近发出的信号。在SIGTERM和SIGINT上添加信号处理程序。在这些处理程序中,您可以设置一个变量,在主epoll循环中检查该变量,而它仍

我正在运行一个epoll循环,有时我对epoll_wait的调用返回-1,errno设置为EINTR。有时,我希望这可以结束epoll循环,比如SIGTERM或SIGINT。但是我用-pg标志编译了这段代码,所以周期性的SIGPROF(27)信号被触发,从而停止我的循环


所以。。。是否可以打开signum,以便确定何时退出或继续?我希望避免使用全局函数跟踪最近发出的信号。

在SIGTERM和SIGINT上添加信号处理程序。在这些处理程序中,您可以设置一个变量,在主epoll循环中检查该变量,而它仍然使用全局、或自管道技巧,可以提供一种相当干净的方式,通过
epoll
通知信号,然后根据信号同步处理。@Tanner我该如何使用它?使epoll_wait ignore signals,注册eventfd,注册通过eventfd通知signum的信号处理程序?我主要使用,但总体流程与
eventfd
相同。添加一个写入管道/fd的信号处理程序,注册fd,等待I/O通知(继续
EINTR
),管道/fd将准备好由I/O读取和选择,此时可以读取和处理signum。