由于 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 错误:测量将在整个执行期间进行”。
我不知道如何补救这个 EINTR 以便 epoll_wait 可以工作。知道这个 EINTR 是如何由 GDB 跟踪生成的吗?
最佳答案
某些信号处理程序会中断 epoll_wait()
、 select()
和任何 Unix 或 Linux 上的类似系统调用。这是设计使然,因此您可以中断这些系统调用。
你不能直接补救。典型的解决方案是显式检查 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
关于c - 由于 EINTR,epoll_wait 失败,如何补救?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6870158/