epoll_wait не работает из-за EINTR, как это исправить?

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


person RajSanpui    schedule 29.07.2011    source источник


Ответы (1)


Определенный обработчик сигналов будет прерывать 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) Прерванный системный вызов

person Codo    schedule 29.07.2011