Ошибка epoll_wait из-за EINTR, как это исправить? - PullRequest
3 голосов
/ 29 июля 2011

Мой 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?

1 Ответ

15 голосов
/ 29 июля 2011

Определенный обработчик сигнала прервет epoll_wait(), select() и подобные системные вызовы в любом Unix или Linux. Это сделано для того, чтобы вы могли прерывать эти системные вызовы.

Вы не можете исправить это напрямую. Типичное решение состоит в том, чтобы явно проверить errno для EINTR и снова выполнить epoll_wait():

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

См. Также: Ошибка GDB: невозможно выполнить epoll_wait: (4) Прерванный системный вызов

...