不要在epoll_wait中终止程序

时间:2013-06-08 13:34:17

标签: c linux signals epoll

我想处理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中断的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

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

不要使用signal()来设置实际的处理程序。它的行为因UNIX平台而异。阅读联机帮助页以获取详细信息。