【问题标题】:Dont terminate program in epoll_wait不要在 epoll_wait 中终止程序
【发布时间】:2013-06-08 13:34:17
【问题描述】:

如果epoll_wait 因任何原因(例如被 SIGINT)中断,我想处理

while ( true ) {
    n = epoll_wait ( epoll_fd, events, max_events, -1 );
    if ( errno == EINTR ) {
        ...
    }
}

但调试器甚至没有转到if。程序在epoll_wait 中终止。我添加了一些魔法:

signal ( SIGINT, placebo );
while ( true ) {
    n = epoll_wait ( epoll_fd, events, max_events, -1 );
    if ( errno == EINTR ) {
        ...
    }
}

一切都按预期工作。但这很丑陋。让我处理任何epoll_wait 的中断的正确方法是什么?

【问题讨论】:

  • epoll 不会神奇地吞噬信号。你仍然必须自己处理信号。不过,我推荐使用 signalfd。
  • 大多数信号(包括SIGTERM)的默认操作是终止进程。所以在第一种情况下,你只是在观察预期的行为。

标签: c linux signals epoll


【解决方案1】:

您需要处理信号或阻止它们。如果您只想忽略 EINTR,我建议通过 sigprocmask() 或 signal(signum, SIG_IGN) 阻塞单线程进程,或通过 pthread_sigmask() 阻塞多线程进程。如果您想实际做某事,请使用 sigaction() 安装处理程序。

不要使用 signal() 来设置实际的处理程序。它的行为因 UNIX 平台而异。有关详细信息,请阅读手册页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多