ここでクラッシュを防ぐためのベストプラクティスは何ですか?
みんなのようにシグパイプを無効にするか、エラーをキャッチして無視します。
回線の反対側がまだ読んでいるかどうかを確認する方法はありますか?
はい、select() を使用します。
select() は、ソケットが書き込み可能であると常に言っているため、ここでは機能していないようです。
読み取りビットを選択する必要があります。書き込みビットはおそらく無視できます。
遠端がファイル ハンドルを閉じると、select は、読み取る準備ができているデータがあることを通知します。これを読み込んでみると、0 バイトが返されます。これは、ファイル ハンドルが閉じられたことを OS が通知する方法です。
書き込みビットを無視できない唯一のケースは、大量のボリュームを送信している場合であり、相手側でバックログが発生するリスクがあり、バッファーがいっぱいになる可能性があります。その場合、ファイル ハンドルに書き込もうとすると、プログラム/スレッドがブロックされるか失敗する可能性があります。書き込みの前に選択をテストすると、それから保護されますが、相手が正常であることや、データが到着することを保証するものではありません。
書き込み時と同様に、close() から sigpipe を取得できることに注意してください。
Close は、バッファリングされたデータをすべてフラッシュします。もう一方の端が既に閉じられている場合、close は失敗し、sigpipe を受け取ります。
バッファリングされた TCPIP を使用している場合、書き込みが成功したということは、データが送信のためにキューに入れられたことを意味するだけであり、送信されたことを意味するわけではありません。close を正常に呼び出すまで、データが送信されたことはわかりません。
Sigpipe は、何か問題が発生したことを通知しますが、何をすべきか、何をすべきかについては通知しません。