Cでチャットアプリケーションを開発しようとしています。私はソケットとselect()
. しかし、クライアントの前にサーバーを閉じると、クライアントに「Broken Pipe」というメッセージが表示されます。select() を使用しましたが、回避する方法がわかりませんでしたか?
質問する
1876 次
2 に答える
4
シグナルを無効にすることができます:
signal(SIGPIPE, SIG_IGN);
選択された答えはシグナルプロセス全体を無視することでしたが、他の選択肢があります:
MSG_NOSIGNAL で send 関数を使用する:
send(con, buff_enviar+enviado, length-enviado, MSG_NOSIGNAL);
ソケットレベルでの SIGPIPE の無効化 (すべてのカーネルで利用できるわけではありません):
int flag = 1;
setsockopt(con, SOL_SOCKET, SO_NOSIGPIPE, &flag, sizeof(flag));
呼び出し元スレッドの SIGPIPE を無効にする (後で復元できます):
sigset_t set;
sigemptyset (&set);
sigaddset (&set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &set, NULL);
于 2013-04-25T16:23:55.953 に答える
0
PIPE シグナルのハンドラーを登録します (シグナルを無視する場合もあります)。
于 2013-04-25T16:22:34.950 に答える