ddの「a + bレコード」の統計では、2つの数値はそれぞれ何を意味しますか?


16

ddstats の最初の2行の形式は次のとおりです。

a+b records in
c+d records out

なぜ2つの数値なのですか?このプラス記号はどういう意味ですか?通常a+0はですが、ブロックサイズを大きくするとddが印刷される場合があります0+b records out

回答:


16

それは、その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も参照してください


10

0+b records outfor b>1は、通常、パイプまたは他のソースからの読み取り中にbs=X、データを十分に迅速に提供できない不完全な読み取りです。ddを使用して、データの完全なブロックを強制的に待機させることができiflag=fullblockます。このオプションはcount=X、countが不完全なブロックもカウントするため、fullblockなしでは信頼できないため、使用している場合に特に便利です...


4

記述子にハングアップして入力を待つことができる標準的なコマンドラインユーティリティは多数あります。それがほとんどすべての仕組みです。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

ddread()入力ブロックごとに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個です。それが、これらのレポートの意味です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.