2012-05-06 19 views

答えて

2

は、あなたが何をやっているやっている方法によっては、は、接続が任意に切断された場合に発生することができSIG_PIPEを処理する必要があります。

他の信号を処理する必要はありません。

あなたがselect()またはpoll()か(個人的な好み)を使用している場合epoll()あなたがエラーをチェックする必要があり(例えば、POLLHUP)あなたは、読み取り/書き込みの可用性をチェック前

また、戻り値は常にread()/write()/send()/recv()であることを確認する必要があります。エラーがある場合は-1を返しますが、0を返した場合は、もう一方の接続が切断されたことを意味します。つまり、0の読み取りは、0バイトが読み取られたことを意味しますが、接続はまだ良好です。そうではありません。ソケットを閉じます。これはPOSIXによって規定されています。

+0

私のコードの最初のバージョンでは、サーバー上でセグメンテーションフォルトが発生したとき、クライアントは無限ループに行きます... その場合、クライアントもSIG_PIPEを受信しましたか? – giozh

+0

@SvenMarnach私は既に両方の側でタイムアウトを使用しています(ただalarm()関数を使用しています)が、他の種類のシグナルがあるかどうかを知りたいと思います:) – giozh

+0

@SvenMarnach:タイムアウトまたはスレッドあなたは何か間違っている。 – delicateLatticeworkFever

関連する問題