次のように入力すると:
cat /dev/urandom
その後、データの出力に時間がかかりますが、次のようになります。
cat /dev/urandom | head -c 10
出力はランダムな10バイト後に終了します。これはhead
、出力が何とか完了したことを意味しますかcat
?
答え1
リーダーを持たないパイプに書き込もうとすると、シグナルをcat
受け取ります(そして終了すると自動的に標準入力を閉じます。これはパイプの読み取り端への唯一のオープンハンドルでもあります)。SIGPIPE
head
もしあなたなら何とかパイプの読み取り端に別のハンドルを持っていくと、猫は終わらないでしょう。詰まったパイプバッファを充填した後:
(Linux固有の例):
cat /dev/urandom 3</dev/stdout | head -c 10 > /tmp/junk
<staying there until you ^C>
また、到着cat
したら無視するsignal SIGPIPE
、信号を生成する書き込みは単に失敗し、=にSIGPIPE
設定されます。errno
EPIPE
Broken pipe
^1:
{ trap '' PIPE; cat /dev/urandom; } | head -c 10 >/tmp/junk
cat: write error: Broken pipe
このhead
プロセスはこれとは何の関係もありません。しかし、実際にはそうではありません。シグナル、指示するまたはまったく気にしないでくださいcat
。必要なものは何でも読んで終了し、残りはすべてオペレーティングシステムに任せます。
^1この後者の動作(非常に迷惑な)はPythonスクリプトのデフォルト動作です。
python -c 'while 1: print("hello")' | head -n2
hello
hello
Traceback (most recent call last):
File "<string>", line 1, in <module>
IOError: [Errno 32] Broken pipe