我的程序有一个事件循环,由epoll
(用于I / O)和条件变量(用于其他消息活动),以及负责捕获信号的工作线程(SIGINT
,{{{ {1}},SIGTERM
)。所有其他主题中都会屏蔽SIGHUP
,SIGINT
,SIGTERM
和SIGHUP
。
我的SIGPIPE
调用有超时500毫秒,但我正在尝试减少上下文切换并使用无限epoll_wait
代替,当主线程决定它的时间时,由管道活动唤醒退出程序,应该停止事件循环。
同样,我的epoll_wait
通话有超时500毫秒(并在每次通话后检查sigtimedwait
,看是否需要停止),我想用某些东西替换它不需要继续醒来检查中断。
我可以从主线程向信号监听线程发出信号来实现这个,或类似的东西吗?或者在这个时代有没有更好的方法来捕捉信号?
这是在CentOS 6和7上(虽然一般的POSIX解决方案是首选 - 仅仅是标准C ++ 11的奖励积分!)。
答案 0 :(得分:5)
使用signal file descriptors代替信号处理程序。
信号的接收现在将通过读取文件描述符而不是信号处理程序来完成,该文件描述符是可上传的,并且可以作为epoll集的一部分进行处理。
是的,这是在Linux上,在这个时代捕获信号的更好方法。