ddの「a + bレコード」統計では、これら2つの数値はどういう意味ですか?

ddの「a + bレコード」統計では、これら2つの数値はどういう意味ですか?

統計の最初の2行のdd形式は次のとおりです。

a+b records in
c+d records out

なぜ2つの値ですか?このプラス記号はどういう意味ですか?一般的に、これは時々a+0大きなブロックサイズを使用すると、ddが印刷されます。0+b records out

答え1

これは、そのサイズのブロック全体とbsbsより小さいサイズの追加ブロックを意味します。

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の答えには、不完全なブロックを生成する別の例が挙げられています。読む価値があります。また、見ることができますhttps://unix.stackexchange.com/a/17357/73443

答え2

0+b records outb>1bs=Xデータを十分に高速に提供できないパイプやその他のソースから読み取ると、不完全な読み込みになることがよくあります。ddデータブロック全体に対して強制待機を使用できますiflag=fullblock。このオプションは、不完全なブロックも計算するために数を使用する場合に特に便利であるため、完全なcount=Xブロックがなければ信頼できません。

答え3

記述子にぶら下がって入力を待つことができる標準的なコマンドラインユーティリティがたくさんあります。これがすべて機能する方法です。dd記述子がどのように見えるかを示すという点でユニークです。

個人的には、私はGNUオプションの目的をよく理解していませんiflag=fullblock。私の言葉は、cat少なくとも簡単に入力でき、I / Oブロックサイズをまったく心配する必要がないということです。

しかし、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()各入力ブロックは操作を実行します。試しているファイルにread()要求された分のデータがない場合は問題ありません。一つ read()次に計算一つ入力ブロック。これがうまくいく方法です。これが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()入力レコード全体はゼロで、短い入力レコードは2つです。それがまさにその報告書が意味するものでした。

関連情報