【问题标题】:Determine which signal caused EINTR?确定是哪个信号引起了 EINTR?
【发布时间】: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。

标签: c++ c signals epoll gperf


【解决方案1】:

在 SIGTERM 和 SIGINT 上添加信号处理程序。在这些处理程序中,您设置了一个在主 epoll 循环中检查的变量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2011-12-25
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多