擬似 yes コマンドを書いたのですが、 SIGPIPE がどうしてよろしく処理されるのかがわからない
$ cat pseudo-yes.sh
#!/bin/sh
while true; do
printf "y\n"
done
$
上記のような、 pseudo-yes.sh
を記述しました。これを、例えば次のように使うと、問題無く yes
コマンドのような動きをしてくれます。
$ ./pseudo-yes.sh | head -n 1
y
$
この挙動を見る限り、 printf
コマンドの実行に際して発生するSIGPIPE
シグナルは、 pseudo-yes.sh
が受信・処理しているはずだと理解できます。(でないと、 while
文から抜け出せるはずがない)
自分の理解ですと、SIGPIPE
シグナルは、 write
システムコールを行ったプロセスに対して発行されるものはずだと思っています。
質問:
- どうして、書き込みを行う主体のプロセスは
printf
なのに、pseudo-yes.sh
がSIGPIPE
を正しく処理できているのでしょうか?
補足:
- この挙動は、 ubuntu と mac-os-x の両方で観測されました。