回答:
それは、そのbs
サイズのブロック全体に加えて、bsより小さいサイズの追加ブロックを意味します。
pushd "$(mktemp -d)"
dd if=/dev/zero of=1 bs=64M count=1 # and you get a 1+0
dd if=1 of=/dev/null bs=16M # 4+0
dd if=1 of=/dev/null bs=20M # 3+1
dd if=1 of=/dev/null bs=80M # 0+1
_crap=$PWD; popd; rm -rf "$_crap"; unset _crap
# frostschutz's case
yes | dd of=/dev/null bs=64M count=1 # 0+1
編集:frostschutzの答えは、非フルブロックを生成する別のケースに言及しています。読む価値があります。/unix//a/17357/73443も参照してください。
記述子にハングアップして入力を待つことができる標準的なコマンドラインユーティリティは多数あります。それがほとんどすべての仕組みです。dd
これは記述子が現在どのように見えるかを示すことができるという点でユニークです。
個人的には、GNU iflag=fullblock
オプションの背後にある有用性を本当に理解していません。つまり、cat
少なくともブロックサイズを心配することなく、少なくとも同じくらい簡単に入力することができます。
しかし、ストリームの一部をdd
取ることができます-そしてそれは合理的に現代のシステムで/ 境界でそれを行うことができます。read()
write()
{ ( sleep 1 #don't write() til dd is definitely setup
printf 123 #write() 3 bytes
printf %-30s\\n 456 #write() 31 bytes
printf you\ there\? #write() 10 bytes
)| dd bs=64 count=2 conv=sync| #2 64 byte read()/write() \0-padded blocks
od -vtc #show it with octal radices
} 2>/dev/null #drop stderr
0000000 1 2 3 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000040 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000060 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000100 4 5 6
0000120 \n \0
0000140 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000160 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000200
dd
read()
入力ブロックごとに1 つ実行します。ファイルならば、それはしようとするread()
-それはそれは問題ではない要求している限りデータを持っていない1つの read()
カウントとして1つの入力のブロック。それがどのように動作するかです-それがdd
の主要なユーティリティです。
ジョブが完了すると、処理dd
したすべての入力/出力ブロックについてレポートします。上記のコマンドを再度実行しますが、今回は代わりにstdoutをドロップします...
dd: warning: partial read (3 bytes); suggest iflag=fullblock
0+2 records in
2+0 records out
128 bytes (128 B) copied, 1.00161 s, 0.1 kB/s
それぞれの時間がdd
なかったread(0,&in,64)
read
短い帰ってきた-その標準入力ファイルディスクリプタは、それはそれを作ったとき、それはその要求を満たすために待っている十分なバイトを持っていなかったので。したがってdd
read()
、完全な入力レコードは0個、短い入力レコードは2個です。それが、これらのレポートの意味です。