プロセスは、リーダーが残っていないタイプSOCK_STREAMのパイプ(名前付きまたは名前なし)またはソケットに書き込もうとすると、SIGPIPEを受け取ります。
一般的には振る舞いが望まれます。典型的な例は次のとおりです。
find . | head -n 1
find
一度head
終了すると実行を続けたくない(そして、そのパイプで読み取りのために開いている唯一のファイル記述子を閉じた)。
yes
コマンドは、一般的に終了させるために、その信号に依存しています。
yes | some-command
何らかのコマンドが終了するまで「y」を書き込みます。
コマンドが終了するときだけでなく、すべてのリーダーがパイプへの読み取りfdを閉じたときでもあることに注意してください。に:
yes | ( sleep 1; exec <&-; ps -fC yes)
1 2 1 0
サブシェルがそのstdinを明示的に閉じた後、パイプから1(サブシェル)、2(サブシェル+スリープ)、1(サブシェル)、そして0 fdの読み取りがありyes
、SIGPIPEを受け取ります。
上記では、ほとんどのシェルはpipe(2)
whileをksh93
使用socketpair(2)
しますが、その点で動作は同じです。
プロセスは、(一般的に、書き込みシステムコールをSIGPIPEを無視するとwrite
、することができるがpwrite
、send
、splice
...)とのリターンEPIPE
エラー。そのため、破損したパイプを手動で処理したいプロセスは、通常SIGPIPEを無視し、EPIPEエラーが発生したときにアクションを実行します。