4 Stimmen

epoll_wait schlägt aufgrund von EINTR fehl, wie kann man das beheben?

Mein epoll_wait schlägt aufgrund von EINTR fehl. Mein gdb-Trace zeigt dies:

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]

Dieser String "epoll_wait error in start timer: Measurement will befor entire duration of execution" wird von mir in stderr ausgegeben.

Ich kann nicht erkennen, wie man dieses EINTR beheben kann, damit epoll_wait funktioniert. Hat jemand eine Idee, wie dieses EINTR durch den GDB-Trace erzeugt wird?

19voto

Codo Punkte 70076

Bestimmte Signalhandler werden unterbrechen epoll_wait() , select() und ähnliche Systemaufrufe auf jedem Unix oder Linux. Dies ist so vorgesehen, damit Sie diese Systemaufrufe unterbrechen können.

Sie können es nicht direkt beheben. Die typische Lösung besteht darin, den errno explizit auf EINTR zu prüfen und epoll_wait() wieder:

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

Siehe auch: gdb-Fehler: epoll_wait kann nicht ausgeführt werden: (4) Unterbrochener Systemaufruf

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X