1

リモート エンドが接続を閉じた場合でも、send() システム コールは初めて成功します。もう一度送信すると、sigpipe が生成されます。リモートエンドが接続を閉じたかどうかを知るために recv システムコールを使用したくありません。

リモートエンドが send システムコールのみを使用して接続を閉じたかどうかを検出する方法を教えてもらえますか?

4

1 に答える 1

1

最初に行うべきことは、 でsignal(SIGPIPE, SIG_IGN);受信SIGPIPEしないように呼び出すsend()か、Linux ではMSG_NOSIGNALフラグをに渡すことsend()です。これを行うと、ピアが切断されたときにシグナルをsend()生成せず、代わりに -1 を返します。SIGPIPEerrno == EPIPE

送信SIGPIPEは、関数の歴史的な動作ですwrite()http://pubs.opengroup.org/onlinepubs/009604599/functions/write.html

EPIPEパイプへの書き込みが試行さFIFOれたか、どのプロセスでも読み取り用に開いていないか、一方の端しか開いていません。シグナルもスレッドにSIGPIPE送信されます。

もともとは、シェル パイプ ( などcmd | other_cmd) 用に作成されました。ctrl-cシェル パイプの実行中に を押すと、パイプ内の最後のプロセスのみが受信およびSIGINT終了します。パイプ内の他のプロセスを終了するには、リーダーが既に終了してSIGPIPEいるプロセスに送信されます。write()STDOUT

于 2011-09-19T08:37:39.967 に答える