リモート エンドが接続を閉じた場合でも、send() システム コールは初めて成功します。もう一度送信すると、sigpipe が生成されます。リモートエンドが接続を閉じたかどうかを知るために recv システムコールを使用したくありません。
リモートエンドが send システムコールのみを使用して接続を閉じたかどうかを検出する方法を教えてもらえますか?
リモート エンドが接続を閉じた場合でも、send() システム コールは初めて成功します。もう一度送信すると、sigpipe が生成されます。リモートエンドが接続を閉じたかどうかを知るために recv システムコールを使用したくありません。
リモートエンドが send システムコールのみを使用して接続を閉じたかどうかを検出する方法を教えてもらえますか?
最初に行うべきことは、 でsignal(SIGPIPE, SIG_IGN);
受信SIGPIPE
しないように呼び出すsend()
か、Linux ではMSG_NOSIGNAL
フラグをに渡すことsend()
です。これを行うと、ピアが切断されたときにシグナルをsend()
生成せず、代わりに -1 を返します。SIGPIPE
errno == EPIPE
送信SIGPIPE
は、関数の歴史的な動作ですwrite()
。http://pubs.opengroup.org/onlinepubs/009604599/functions/write.html
EPIPE
パイプへの書き込みが試行さFIFO
れたか、どのプロセスでも読み取り用に開いていないか、一方の端しか開いていません。シグナルもスレッドにSIGPIPE
送信されます。
もともとは、シェル パイプ ( などcmd | other_cmd
) 用に作成されました。ctrl-c
シェル パイプの実行中に を押すと、パイプ内の最後のプロセスのみが受信およびSIGINT
終了します。パイプ内の他のプロセスを終了するには、リーダーが既に終了してSIGPIPE
いるプロセスに送信されます。write()
STDOUT