1

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

4

1 回答 1

2

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

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

于 2013-06-09T22:29:52.860 回答