私のユーザスペースアプリケーションは、何らかの理由でEINTR-Signalを受信した後でブロックされることがあります。私はstraceので記録何EINTR(中断されたシステムコール)を処理する方法
:
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