Moja aplikacja przestrzeni użytkownika czasami blokuje się po otrzymaniu sygnału EINTR, w jakiś sposób.Obsługa EINTR (przerwane wywołanie systemowe)
Co nagrałem z strace:
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
mogę złapać sygnał Eintr i jak mogę powtórzyć dotyczyło połączeń, takich jak pisać, czytać lub wybrać? Jak ustalić, GDZIE wystąpił ten błąd EINTR, nawet jeśli korzystałem z bibliotek innych firm pracujących z wywołaniami systemowymi?
Dlaczego moja aplikacja jest całkowicie zablokowana po otrzymaniu EINTR (zobacz strace dump: wysłałem SIGUSR1, który normalnie powinien być obsługiwany)? I dlaczego futext() zwraca ERESTARTSYS do przestrzeni użytkownika?
dzięki
EINTR nie jest to sygnał, ale numer błędu zwracana przy wywołania systemowego przerwany przez sygnał. –
Użyj 'gstack' lub' gdb', aby uzyskać ślad stosu, aby dowiedzieć się, gdzie aktualnie utknął program. – mark4o