[解決済み】SIGPIPEを防止する方法(または適切に処理する方法)について)
質問
TCPまたはローカルのUNIXソケットで接続を受け付け、簡単なコマンドを読み取り、(コマンドに応じて)応答を送信する小さなサーバープログラムを持っています。
問題は、クライアントが回答に関心を持たず、時には早期に終了してしまうことがあることです。 そのため、そのソケットに書き込むと
SIGPIPE
で、私のサーバーがクラッシュしてしまいます。
ここでクラッシュを防ぐためのベストプラクティスは何でしょうか?相手側がまだ読んでいるかどうかを確認する方法はありますか? (
select()
は、ソケットが書き込み可能であると常に言うので、ここでは動作しないようです)。それとも
SIGPIPE
をハンドラで指定し、それを無視するのでしょうか?
どのように解決するのですか?
一般的には
SIGPIPE
を作成し、コード内で直接エラーを処理します。 これは、C言語のシグナルハンドラには、できることに多くの制限があるためです。
最も移植性が高いのは
SIGPIPE
ハンドラから
SIG_IGN
. これにより、ソケットやパイプへの書き込みが原因で
SIGPIPE
シグナルを送信します。
を無視するには
SIGPIPE
シグナルを使用するには、次のコードを使用します。
signal(SIGPIPE, SIG_IGN);
を使用している場合は
send()
の呼び出しで、もう一つの選択肢は
MSG_NOSIGNAL
オプションを指定すると
SIGPIPE
の動作を呼び出しごとにオフにします。 すべてのオペレーティングシステムが
MSG_NOSIGNAL
フラグを使用します。
最後に、このような場合にも
SO_SIGNOPIPE
で設定できるソケットフラグです。
setsockopt()
を使用すると、一部のオペレーティングシステムで これによって
SIGPIPE
は、設定されたソケットへの書き込みによってのみ引き起こされます。
関連
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】malloc():メモリ破壊
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] 出力をファイルや標準出力にリダイレクトする方法
-
[解決済み] Javaでファイルが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み】C言語におけるファイルスコープでの可変長配列の変更
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み】警告:引数「互換性のないポインタ型から」を渡す[デフォルトで有効]。
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】whileループの時間複雑性(Big O)はどうやったらわかるの?
-
[解決済み] IOErrorです。[Errno 32] パイプ接続時にパイプが壊れました。`prog.py | othercmd` です。