cat にパイプラインすると dd がすぐに終了するのはなぜですか?

cat にパイプラインすると dd がすぐに終了するのはなぜですか?

Cygwin で bash を起動し、次のように入力します。

dd if=/dev/zero | cat /dev/null

すぐに終わります。次のように入力すると、

dd if=/dev/zero > /dev/null

期待通りに動作し、発行できます

killall -USR1 dd

進行状況を確認します。前者の呼び出しはなぜすぐに終了するのでしょうか? Linux ボックスでも同じですか?

*** なぜ私がこのような愚かな質問をしたのか、そしておそらくそれほど愚かではない質問をしたのかの説明

HDD イメージを圧縮していたのですが、一部は正しく圧縮されていませんでした。最終的に、問題を示す次のスクリプトが作成されました。

while sleep 1 ; do killall -v -USR1 dd ; done &
dd if=/dev/zero bs=5000000 count=200 | gzip -c | gzip -cd |  wc -c

Wc は最後に 1000000000 を書き込む必要があります。問題は、私のマシンではそれが実行されないことです。

bash-3.2$ dd if=/dev/zero bs=5000000 count=200 | gzip -c | gzip -cd |  wc -c
13+0 records in
12+0 records out
60000000 bytes (60 MB) copied, 0.834 s, 71.9 MB/s
27+0 records in
26+0 records out
130000000 bytes (130 MB) copied, 1.822 s, 71.4 MB/s
200+0 records in
200+0 records out
1000000000 bytes (1.0 GB) copied, 13.231 s, 75.6 MB/s
1005856128

これはバグでしょうか、それともまた私が何か間違ったことをしているのでしょうか?

答え1

あなたがしようとしていることを行う理由は思いつきませんが、次の方法があなたが探している方法だと思います。

 dd if=/dev/zero | cat > /dev/null

答え2

私の知る限り、最初のコマンドは機能しません。/dev/zero の出力を、入力を必要としないコマンドにパイプしようとしています。

cat /dev/null何も出力しないコマンドです。したがって、そこに何かをパイプしても何も起こりません。

stdout リダイレクトを使用すると、/dev/zero の出力が問題のファイルに書き込まれます (/dev/null なので、どこにも書き込まれません)。

答え3

それは何dd if=/dev/zero | cat /dev/nullを意味しますか:

cat /dev/nullstdin をddstdoutに接続して実行します。問題は、それが/dev/null空であることです。したがって、cat要求された操作を実行します。空のファイルを開き、その内容を stdout に書き込んで終了します。

catファイルが指定されていない場合にのみ、stdin からの出力をパイプします。/dev/nullcat /dev/null -と stdin の内容を stdout にパイプします。

このように、dd if=/dev/zero | cat /dev/nullプロセスを無駄にすること以外は、何も違いはありませんcat /dev/null

答え4

Cygwin と Ubuntu で試してみましたが、Ubuntu では正しい結果が得られました。信号を送信しないと、ddCygwin では動作します。これはバグだと思います。

tee出力をファイルに送信すると、すべてゼロ バイトで構成されていましたが、その数が多すぎました。

dd if=/dev/zero bs=5000000 count=200 | gzip -c | gzip -cd |  tee dd.out | wc -c

関連情報