SIGPIPE〜ソケットに書き込もうとしたら相手側がすでに切断中だった〜


目次に戻る


SIGPIPEはソケットに対して書き込む(send、write)しようとしたら、相手側がすでに切断(close)していた場合に発生するシグナルです。シグナルの解説をあまりしていないので詳しい話はしませんが、SIGPIPEシグナルが発生すると、デフォルトではプロセスが強制終了されます。
 
強制終了を回避する方法は二つ。
  1. シグナルを受け取った時の動作を強制終了以外の動作に設定する。
  2. send時にオプションを指定することでSIGPIPEが発生しないようにする。
 
 
/* シグナルを受け取ったときの動作を変更 */
 
signal( SIGPIPE , SIG_IGN );   /* シグナルを無視する */
 
/* send時にオプションを設定することでSIGPIPEを発生させない */

int re;

re = send( fd , buff ,buffsize , MSG_NOSIGNAL );

if( re == -1 )
{
    switch( errno ){
        case EPIPE:
            /* 送信先がcloseしていた為のエラー */
            break;
    }
}



目次に戻る