【发布时间】:2013-11-23 11:25:13
【问题描述】:
我正在运行一个 epoll 循环,有时我对 epoll_wait 的调用返回 -1 且 errno 设置为 EINTR。有时,我希望它结束 epoll 循环,例如 SIGTERM 或 SIGINT。但是我使用 -pg 标志编译了这段代码,因此会发出周期性的 SIGPROF (27) 信号来停止我的循环。
那么...是否可以打开 signum 以便我可以确定何时退出与继续?我想避免使用全局变量来跟踪最近触发的信号。
【问题讨论】:
-
虽然它仍然使用全局,
eventfd或自管道技巧可以提供一种相当干净的方式来通过epoll通知信号,然后根据signum 同步处理它。 -
@Tanner 我将如何使用它?让epoll_wait忽略信号,注册eventfd,注册通过eventfd通知signum的信号处理器?
-
我主要用self pipe trick,但整体流程和
eventfd是一样的。添加一个信号处理程序,写入管道/fd,注册 fd,等待 I/O 通知(继续EINTR),管道/fd 将准备好被 I/O 读取和选择,此时可以读取和处理signum。