내 사용자 공간 응용 프로그램이 EINTR 신호를받은 후 차단되는 경우가 있습니다.EINTR (인터럽트 된 시스템 호출) 처리 방법
내가 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
내가 EINTR 신호를 잡을 수있는 방법 나는 그런 쓰기 등의 우려 호출을 반복 할 수 있습니다 읽거나 선택? 시스템 호출로 작업하는 타사 라이브러리를 사용 했더라도이 EINTR이 발생한 위치를 어떻게 확인할 수 있습니까?
왜 내 앱이 EINTR을받은 후 완전히 차단 되었습니까 (strace 덤프를 참조하십시오 : 보통 처리해야하는 SIGUSR1을 보냈습니다)? 그리고 futex()가 ERESTARTSYS를 사용자 공간으로 반환하는 이유는 무엇입니까?
감사
에서 "패자 모드"의 설명을 참조하십시오. –
'gstack' 또는'gdb'를 사용하여 스택 트레이스를 얻고 프로그램이 현재 멈춰있는 곳을 찾습니다. – mark4o