2012-05-10 13 views
6

recv()を定期的に呼び出すコードがあります(MSG_DONTWAITフラグ付き)。私はvtuneで自分のコードをプロファイリングするので好奇心が強いです。私はsigprocmask()という呼出しがrecv()に関連付けられているのを見ています。実行にはかなりの時間を要しています。私はなぜrecv()sigprocmask()を呼んでいるのか不思議です。recvシステムコールを呼び出すときにsigprocmaskが呼び出されるのはなぜですか?

+0

この現象を再現する可能な限り小さなコードの関連トレースを確認できますか?デモコードも見ることができますか?信号マスクに何が行われているかを正確に見ることができます。 – pilcrow

+0

'recv()'に対するこれらの呼び出しの文脈について詳しく説明できますか?どのようなソケットを使用していますか?あなたは 'recv()'を直接呼びますか? – alk

答えて

0

おそらくrecvは、シグナルがブロックされた場合に他の方法では見られない関連シグナルが生成されたかどうかを知ることができます。 EAGAIN/EWOULDBLOCKは、ブロックされる可能性のあるシグナルを使って時々生成されるerrnoの値として気になります。 sigprocmask man pageを見ましたか?

+1

EAGAINはエラーコードであり、信号ではありません。 – pilcrow

+0

Brainfart、私は誤りを意味しました。ありがとう。このエラーは、処理された信号に基づいて生成されることがあります。 – JimR

1

linuxの下でTCPソケットを使って作業する場合、相手側が予期せず閉じられた場合、SIGPIPEを受信します。

あなたは、この信号をマスクすることができますので、(ほとんどの時間を、あなたは0の戻り値を自分で処理します、あなたは、この信号を気にしない)、私は信号状態のためシステムライブラリのチェックを推測、マスクされている場合は、より高速なコードパスを使用します。

そうでない場合、最適化することはできません。

ところで、あなたはpselect()について知っていますか?

関連する問題