Meine User-Space-Anwendung blockiert manchmal nach dem Empfang eines EINTR-Signals irgendwie.Umgang mit EINTR (unterbrochener Systemanruf)
Was ich mit strace aufgezeichnet:
time(NULL) = 1257343042
time(NULL) = 1257343042
rt_sigreturn(0xbff07be4) = -1 EINTR (Interrupted system call)
--- SIGALRM (Alarm clock) @ 0 (0) ---
time(NULL) = 1257343042
futex(0xb7cea80c, 0x80 /* FUTEX_??? */, 2) = ? ERESTARTSYS (To be restarted)
--- SIGUSR1 (User defined signal 1) @ 0 (0) ---
sigreturn() = ? (mask now [ALRM])
futex(0xb7cea80c, 0x80 /* FUTEX_??? */, 2) = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
futex(0xb7cea80c, 0x80 /* FUTEX_??? */, 2) = ? ERESTARTSYS (To be restarted)
--- SIGTERM (Terminated) @ 0 (0) ---
time(NULL) = 1257343443
time(NULL) = 1257343443
futex(0xb7cea80c, 0x80 /* FUTEX_??? */, 2) = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
futex(0xb7cea80c, 0x80 /* FUTEX_??? */, 2
Kann ich das EINTR Signal fangen und wie kann ich besorgt Anrufe wie Schreib wiederholen, lesen oder wählen Sie? Wie kann ich feststellen, wo diese EINTR aufgetreten ist, auch wenn ich Bibliotheken von Drittanbietern verwendet, die mit Systemaufrufen arbeiten?
Warum ist meine App nach Erhalt eines EINTR vollständig blockiert (siehe strace dump: Ich habe eine SIGUSR1 gesendet, die normalerweise behandelt werden sollte)? Und warum bringt Futex() ERESTARTSYS zurück in den Benutzerbereich?
dank
EINTR ist kein Signal, sondern eine Fehlernummer zurückgegeben auf einen Systemaufruf durch ein Signal unterbrochen. –
Verwenden Sie 'gstack' oder' gdb', um einen Stack-Trace zu erhalten, um herauszufinden, wo das Programm gerade hängt. – mark4o