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