4

我的 epoll_wait 由于 EINTR 而失败。我的 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 可以工作。知道这个 EINTR 是如何由 GDB 跟踪生成的吗?

4

1 回答 1

18

某些信号处理程序会在任何 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) 系统调用中断

于 2011-07-29T08:16:23.110 回答