Apa arti kedua angka tersebut dalam statistik “a + b records” dd?

16

2 baris pertama dalam ddstatistik memiliki format berikut:

a+b records in
c+d records out

Mengapa 2 nilai numerik? Apa arti tanda plus ini? Biasanya a+0, tapi kadang-kadang ketika saya menggunakan ukuran blok yang lebih besar, cetak dd0+b records out

baskom
sumber

Jawaban:

16

Ini berarti blok penuh bsukuran itu ditambah blok tambahan dengan ukuran lebih kecil dari 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

Sunting : jawaban frostschutz menyebutkan kasus lain untuk menghasilkan blok yang tidak lengkap. Layak dibaca. Lihat juga /unix//a/17357/73443 .

Arthur2e5
sumber
10

0+b records outuntuk b>1bacaan biasanya tidak lengkap saat membaca dari pipa atau sumber lain yang tidak bisa menyediakan bs=Xdata dengan cukup cepat. Anda dapat memaksa dduntuk menunggu blok data penuh menggunakan iflag=fullblock. Opsi ini sangat berguna jika Anda juga menggunakan count=Xsebagai hitungan juga menghitung blok tidak lengkap sehingga tidak dapat diandalkan tanpa blokir penuh ...

frostschutz
sumber
4

Ada lusinan utilitas baris perintah standar yang dapat menunggu deskriptor dan menunggu input. Begitulah cara mereka semua bekerja. ddunik karena dapat menunjukkan kepada Anda seperti apa deskriptor sekarang .

Secara pribadi, saya tidak begitu mengerti manfaat di balik GNU iflag=fullblock opsi . Maksud saya, Anda hanya dapat catinput Anda setidaknya dengan mudah dan tanpa harus khawatir tentang ukuran blok i / o sama sekali.

Tetapi dddapat mengambil bagian dari aliran - dan dapat melakukannya di read()/ write()batas pada sistem yang cukup modern.

{ (     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

ddmelakukan satu read()blok input per. Jika file itu mencoba untuk read()tidak memiliki data sebanyak itu telah meminta tidak peduli - yang satu read() dianggap sebagai salah satu blok masukan. Begitulah cara kerjanya - itu adalah ddutilitas utama.

Ketika telah melakukan tugasnya, ddlaporkan semua blok input / output yang telah ditangani. Menjalankan perintah di atas lagi, tetapi menjatuhkan stdout kali ini ...


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

Setiap kali ddmemang read(0,&in,64) readkembali pendek - karena file stdin deskriptor tidak memiliki cukup byte menunggu untuk memenuhi permintaannya ketika membuatnya. Dan dd read()0 catatan input penuh, dan 2 catatan pendek. Itulah yang dimaksud laporan itu.

mikeserv
sumber