我的用戶空間模塊接收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(:我發了SIGUSR1通常的處理方式,請參閱strace轉儲)之後被完全阻塞?爲什麼futex()將ERESTARTSYS返回給用戶空間?
感謝
討論EINTR不是信號但在一個系統調用信號中斷的錯誤數返回。 – 2009-11-04 15:06:22
使用'gstack'或'gdb'獲取堆棧跟蹤,找出程序當前停滯的地方。 – mark4o 2009-11-04 16:08:01