6

recv()定期的に (MSG_DONTWAITフラグを使用して)呼び出すコードがいくつかあります。vtune でコードのプロファイリングを行っていると、 にsigprocmask()関連付けられた呼び出しが表示recv()され、合計実行時間の大部分がかかっていることがわかります。recv()がなぜを呼び出しているのか興味がありsigprocmask()ます。

4

2 に答える 2

1

LinuxでTCPソケットを使用している場合、反対側が予期せず閉じられた場合はSIGPIPEを受け取ります。

このシグナルはマスクできるので(ほとんどの場合、戻り値0は自分で処理しますが、このシグナルは気にしません)、システムライブラリがシグナルの状態をチェックし、マスクされている場合は、より高速なコードパス。

そうでない場合、最適化できません。

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

于 2012-10-29T11:51:28.027 に答える
0

おそらくそのため、recv は、関連するシグナルが生成されているかどうかを判断できますが、シグナルがブロックされた場合は表示されません。EAGAIN/EWOULDBLOCK は、ブロックされる可能性のあるシグナルを使用して生成されることがある errno の値として思い浮かびます。sigprocmaskmanページを見ましたか?

于 2012-05-11T15:48:58.120 に答える