

高岡智則
年齢:33歳 性別:男性 職業:Webディレクター(兼ライティング・SNS運用担当) 居住地:東京都杉並区・永福町の1LDKマンション 出身地:神奈川県川崎市 身長:176cm 体系:細身〜普通(最近ちょっとお腹が気になる) 血液型:A型 誕生日:1992年11月20日 最終学歴:明治大学・情報コミュニケーション学部卒 通勤:京王井の頭線で渋谷まで(通勤20分) 家族構成:一人暮らし、実家には両親と2歳下の妹 恋愛事情:独身。彼女は2年いない(本人は「忙しいだけ」と言い張る)
sigpipeとは?
sigpipe は、Unix系のオペレーティングシステムで使われる信号のひとつです。信号とは、OS が「ある出来事が起きたよ」とプロセスに知らせる仕組みで、sigpipe はとくにパイプと呼ばれるデータの流れの中で発生します。パイプは「書き込み端」と「読み取り端」という2つの端を持つ、プロセス間通信の基本的な仕組みです。
パイプを使ってデータを送る途中で、読み取り端がすでに閉じられている状態になると、書き込み側のプロセスに対して SIGPIPE が送られます。これが発生すると、デフォルトの挙動としては書き込み側のプロセスが終了することがあり、思わぬ通知なしにプログラムが落ちてしまう原因になります。
基本的なポイントは次のとおりです。まず、SIGPIPE は「書き込みを試みた相手がいなくなった」という状態を知らせる信号です。次に、デフォルトではこの信号を受け取るとプロセスが終了します。これを回避するには、信号を無視するか、エラーをきちんと検知して処理を分岐させる必要があります。
なぜ sigpipe が発生するのか
sigpipe が発生する最も典型的な場面は、パイプを介した通信で読み取り端が閉じられているときです。例えば親子プロセスの通信や、サーバーとクライアントのデータ送信において、受け手側の処理が終わって読み取りを止めた場合などです。読み取り端が閉じられているのに書き込みをしてしまうと、送信側には「もうデータを届ける相手がいない」という状況が生まれ、SIGPIPE が発生します。
対処法の基本
対処法1: SIGPIPE を無視する。プログラムの初期化部分で <span>SIGPIPE を無視する設定を入れると、write() が SIGPIPE で終了する代わりに -1 を返すようになり、errno に EPIPE が設定されます。これにより、プログラム側でエラー処理を柔軟に行えます。
対処法2: errno をチェックする。write() や send() の戻り値が -1 になった場合、errno が EPIPE かどうかを確認します。EPIPE が返っていれば「相手が閉じた」状況と判断し、適切な後処理を行います。
対処法3: SIGPIPE ハンドラを用意する。自分で信号ハンドラを作成し、SIGPIPE 発生時にログを書き出す、リソースを解放する、再試行の方針を決めるなどの処理を実装します。これにより、単純に終了させずに安定動作を維持できます。
対処法4: 非ブロッキング I/O や select/poll の活用。書き込みを行う前に読み取り端がまだ開いているかを調べる、もしくは非ブロックモードで I/O を行い、状態変化を待つことで SIGPIPE の発生を未然に回避できます。
実践的な例とポイント
C 言語での基本的な考え方を以下にまとめます。パイプやソケットを作成し、書き込み側はデータを書こうとします。相手が閉じているときには write() が失敗します。代表的な状況と対応は次のとおりです。
・write() が -1 を返し errno が EPIPE の場合、受け手が閉じたと判断して適切に処理します。
・SIGPIPE を無視している場合でも、必ずエラーハンドリングを行います。信号を無視するだけでなく、戻り値の確認と errno の判定を組み合わせると堅牢性が上がります。
以下はコードの最小限の考え方です。実際のコードは環境により異なりますが、キーワードは同じです。
1) SIGPIPE を無視する例
・最初に signal(SIGPIPE, SIG_IGN); を設定します。これにより write() は SIGPIPE で終了せず、戻り値 -1 と errno が設定されます。
2) errno を確認する例
・write() の戻り値をチェックし、失敗時に errno == EPIPE かどうかを確認します。これにより再送信の可否や後処理を適切に制御できます。
言語別の扱いの違い
言語ごとに sigpipe の扱いは多少異なります。たとえば Python では、同様の状況で BrokenPipeError が発生します。JavaScript の Node.js では EPIPE エラーとして扱われることが多く、イベントループの中でエラーハンドリングを行います。いずれの言語でも、基本は「書き込み時のエラーを捕捉して適切に処理する」という点です。
実務でのヒント
実務では、信号を鵜呑みにせず、必ず戻り値と errno を組み合わせて判定する癖をつけましょう。長時間動作するサーバーやパイプを多用するアプリケーションでは、SIGPIPE の有効・無効化を用途に合わせて選択します。リソースの解放タイミングや、再接続のポリシーを事前に決めておくと、障害時の復旧がスムーズになります。
要点の表
| 挙動 | 対処法 | |
|---|---|---|
| 読み取り端が閉じられる | 書き込み時に SIGPIPE が送られる / errno が EPIPE | エラーハンドリングを追加、必要に応じて SIGPIPE の扱いを決定 |
| SIGPIPE を無視する設定 | write() は -1 を返す | 適切な後処理、リソース解放、再試行方針の決定 |
まとめ
sigpipe は、パイプを使うプログラム間の通信で読み取り端が閉じられたときに発生します。デフォルトの挙動はプロセスの終了ですが、適切な対処を行うことで落ちずに安定動作を維持できます。初心者のうちは errno の EPIPE の理解と、write の戻り値をしっかり確認する習慣を身につけましょう。
sigpipeの同意語
- SIGPIPE
- パイプへの書き込みを試みた際、読み取り側(リーダー)がいなくなると送られるPOSIXのシグナル。プロセスは通常これを受け取って終了したり、適切に処理を止めます。
- Broken pipe
- 英語表現で、パイプの読み取り側が居なくなった状態で書き込みを行ったときに発生するエラー/状態の総称。
- EPIPE
- パイプが壊れている・閉じられている状態での書き込み時に設定されるerrno。SIGPIPEと連携してエラーハンドリングが行われます。
- パイプ書き込みエラー
- パイプへ書き込みを試みた際に発生するエラーの日本語表現。原因はリーダー不在やパイプが閉じていることが多い。
- Broken pipe signal
- Broken pipeと同義で使われる表現。パイプのリーダーがいない状態で書き込みを試みたときに発生する信号のこと。
- 信号番号13
- 多くのUnix系OSでSIGPIPEに対応する信号番号。環境によっては異なる場合もあるが、一般的には13番。
sigpipeの対義語・反対語
- SIGPIPE発生
- パイプに読み取り側がいない状態で書き込みを試みたときに送られる信号。これが起きるとプロセスが停止・終了する場合があるのが特徴です。対義語としてはSIGPIPEが発生しない状況が挙げられます。
- SIGPIPEなし
- パイプへ書き込みをしてもSIGPIPEが送られない状態。読み取り側が常に存在する、またはSIGPIPEを無効化している状況を表します。
- 読み手ありパイプ
- パイプに読み取り側が常に存在する状態。書き込みをしてもSIGPIPEは発生せず、正常にデータを書き込める状況を指します。
- SIGPIPE無効化
- プロセスがSIGPIPEの伝達を無視する設定。結果としてSIGPIPEによる終了を回避し、書き込みエラーを別の方法で処理します(EPIPEになることもある)。
- EPIPEエラー
- SIGPIPEの代わりにエラーコードEPIPEが返される状態。SIGPIPEを無効化した場合の代替のエラーとして現れることがあります。
- SIGPIPEを無視する設定
- プログラムでSIGPIPEを無視するように設定した状態。これにより、書き込み時にSIGPIPEが送られてもプロセスは終了せず、エラー処理へ移ります。
sigpipeの共起語
- パイプ
- プロセス間通信の基本的なデータ路。読み取り端と書き込み端の2つの端があり、読み取り端がいなくなると書き込みで SIGPIPE が発生することがある。
- 読み取り端
- パイプのデータを受け取る側。読み取り端が閉じられると、書き込み側へ SIGPIPE が送られることがある。
- 書き込み端
- パイプのデータを書き込む側。読み取り側がいなくなると SIGPIPE が発生することがある。
- シグナル
- OSからの通知機構。特定のイベントに対して処理を定義できる。
- SIGPIPE
- パイプやソケットの書き込み時、読者がいない状態で送られるシグナル。デフォルトはプロセスの終了。
- EPIPE
- Broken pipeを表すerrno。書き込み時に相手が閉じている場合に発生し、エラーとして返されることがある。
- errno
- システムコールのエラーコードの総称。EPIPEはその一種。
- ソケット
- ネットワーク通信の端点。相手が閉じた場合、書き込み時に SIGPIPE が送られることがある。
- POSIX
- Unix系の標準仕様。SIGPIPEやパイプの挙動はPOSIX準拠。
- UNIX
- Unix系OSの総称。SIGPIPEはその環境でよく使われる概念。
- IPC
- Inter-Process Communication。プロセス間のデータ伝達の総称。
- デフォルト動作
- SIGPIPEのデフォルトの挙動はプロセスの終了。
- SIG_IGN
- SIGPIPEを無視する設定。無視すると write が -1 を返し、errno が EPIPE になることがある。
- シグナルハンドラ
- SIGPIPEを処理するカスタム関数。自分で挙動を定義できる。
- Broken pipe
- 英語表現。壊れたパイプの意味で、EPIPEの原因となる状況を指すことが多い。
- write コール
- データをパイプやソケットへ書き込むシステムコール。相手がいないと SIGPIPE/EPIPE が発生することがある。
- read コール
- データを読み込むシステムコール。読み取り側が閉じられると状態が変化する。
- close
- ファイル記述子を閉じる操作。読み取り端が閉じられた状態で書き込みを試みると SIGPIPE が発生することがある。
- PIPE_BUF
- パイプ内の一度に書き込む最大バイト数。POSIXではこの値以下の書き込みは原子性が保証されるが、SIGPIPE自体には直接影響しない。
- sigaction
- シグナルの挙動を設定するための関数。SIGPIPEのハンドリングを細かく制御できる。
- 信号マスク
- 特定のシグナルを一時的に受信禁止にする機能。SIGPIPEをマスクすることで一時的に影響を避けられる。
sigpipeの関連用語
- SIGPIPE
- パイプまたはソケットへの書き込み時、読み手がいなくなった場合にプロセスへ送られるシグナル。デフォルトではプロセスの終了。ハンドラを設定したり無視することで終了を回避できます。
- EPIPE
- 書き込み時に相手が読み取りを終了している状態で発生するエラーコード。errno が EPIPE になります。
- pipe
- プロセス間でデータを一方向にやり取りする IPC の基本構造。2つのファイルディスクリプタを使い、片方向のデータ流を提供します。
- FIFO(命名パイプ)
- 名前付きのパイプ。mkfifo で作成し、ファイルシステム上のパイプとして異なるプロセス間で通信できます。
- socketpair
- 2つの連結された UNIXドメインソケットを作成し、双方向通信を行える IPC 手段。パイプの代替として使われます。
- fork
- 新しい子プロセスを作る UNIX のシステムコール。親子間でパイプを介してデータを送受信する際によく使われます。
- read
- パイプやファイルからデータを読み出すシステムコール。
- write
- パイプやファイルへデータを書き込むシステムコール。
- close
- ファイルディスクリプタを閉じる操作。最後の端が閉じられると相手側で SIGPIPE/EPIPE が発生することがあります。
- ファイルディスクリプタ(FD)
- OS がリソースを識別する整数。パイプの両端はそれぞれ別個の FD で表されます。
- errno
- システムコールが失敗したときに設定されるエラーコードを保持する変数。EPIPE は壊れたパイプを意味します。
- BrokenPipeError
- Python などで、相手が読み取りを終了している状態で書き込もうとすると発生する例外。
- シグナル処理
- SIGPIPE を受け取ったときの挙動を決める設定。sigaction や signal で制御します。
- MSG_NOSIGNAL
- send 系の関数で、SIGPIPE を発生させずにデータを送信するフラグ。主に Linux 系で使われます。
- SO_NOSIGPIPE
- BSD 系のソケットオプションで、ソケットの書き込み時に SIGPIPE を発生させないようにします。
- UNIXドメインソケット
- 同一ホスト上のプロセス間通信に用いるソケット。ファイルシステム上のエンドポイントを利用します。
- IPC(Inter-Process Communication)
- プロセス間でデータやメッセージをやり取りする仕組みの総称です。
- POSIX
- パイプ、フォーク、read、write、シグナルなど、UNIX系の標準仕様。SIGPIPE も POSIX に準拠します。
- シェルパイプ
- シェル上でコマンドをパイプでつなぎ、前のコマンドの出力を後続コマンドへ渡す仕組み。SIGPIPE の扱いはシェル実装に依存します。



















