epoll_wait由于EINTR而失败,如何解决这个问题?

时间:2011-07-29 07:54:58

标签: c linux system-calls epoll interrupted-exception

由于EINTR,我的epoll_wait失败了。我的gdb跟踪显示了这个:

enter code here
221     in ../nptl/sysdeps/pthread/createthread.c
(gdb) 
224     in ../nptl/sysdeps/pthread/createthread.c
(gdb) 
 [New Thread 0x40988490 (LWP 3589)]

227     in ../nptl/sysdeps/pthread/createthread.c
(gdb) 
epoll_wait error in start timer: Measurement will befor entire duration of execution
epoll_wait: Interrupted system call
[Thread 0x40988490 (LWP 3589) exited]

此字符串“启动计时器中的epoll_wait错误:测量将在整个执行期间”由我在stderr中打印。

我无法弄清楚,如何修复此EINTR以便epoll_wait可以正常工作。知道GDB跟踪如何生成这个EINTR吗?

1 个答案:

答案 0 :(得分:15)

某些信号处理程序将在任何Unix或Linux上中断epoll_wait()select()和类似的系统调用。这是设计使您可以中断这些系统调用。

你不能直接补救它。典型的解决方案是显式检查EINTR的errno并再次执行epoll_wait()

int nr;
do {
    nr = epoll_wait(epfd, events, maxevents, timeout);
} while (nr < 0 && errno == EINTR);

另见:gdb error: Unable to execute epoll_wait: (4) Interrupted system call