İki sayı, dd'nin “a + b kayıtları” istatistiklerinde sırasıyla ne anlama geliyor?


16

ddİstatistiklerdeki ilk 2 satır şu biçime sahiptir:

a+b records in
c+d records out

Neden 2 sayısal değer? Bu artı işareti ne anlama geliyor? Genellikle a+0, ancak bazen daha büyük blok boyutu kullandığımda, dd baskılar0+b records out

Yanıtlar:


16

Bu bsboyutta tam bloklar ve bs'den daha küçük boyutlu ekstra bloklar anlamına gelir .

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

Düzenleme : frostschutz'un cevabı tam olmayan bloklar oluşturmak için başka bir durumdan bahsediyor. Okumaya değer. Ayrıca bkz . Https://unix.stackexchange.com/a/17357/73443 .


10

0+b records outçünkü b>1bir borudan veya bs=Xveriyi yeterince hızlı sağlayamayan başka bir kaynaktan okurken genellikle eksik okumalardır . ddTuşlarını kullanarak veri bloklarının tamamını beklemeye zorlayabilirsiniz iflag=fullblock. Bu seçenek özellikle count=Xsayı olarak da eksik blokları sayarsanız kullanışlıdır, bu nedenle tam blok olmadan güvenilmezdir ...


4

Bir tanımlayıcıya asılabilecek ve girişi bekleyebilecek düzinelerce standart komut satırı yardımcı programı vardır. Hepsi bu şekilde çalışıyor. ddbir tanımlayıcının şu anda nasıl göründüğünü gösterebilmesi açısından benzersizdir .

Şahsen, GNU iflag=fullblockseçeneğinin arkasındaki faydayı gerçekten anlamıyorum . Yani, catgirişinizi en azından kolayca ve i / o blok boyutları hakkında endişelenmenize gerek kalmadan yapabilirsiniz.

Ancak bir akışın ddbir parçasını alabilir - ve bunu makul derecede modern bir sistemde read()/ write()sınırlarında yapabilir .

{ (     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()giriş bloğu başına bir tane yapar . O çalışırsa dosya varsa read()çok veri olarak yok o önemli değil talep ettiği gibi - bir read() sayar olarak bir girdi bloğunun. Bu şekilde çalışır - bu ddbirincil yardımcı programdır.

İşini yaptığında dd, ele aldığı tüm giriş / çıkış bloklarını rapor eder. Yukarıdaki komutu tekrar çalıştırın, ancak bu sefer stdout'u bırakın ...


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

Her seferinde ddvermedi read(0,&in,64) readkısa geri geldi - onun Stdin dosya tanımlayıcı bunu yaptığında onun isteğini yerine getirmek için yeterli bayt bekleyen yoktu çünkü. Ve böylece dd read()0 tam giriş kaydı ve 2 kısa kayıt. Bu raporların anlamı budur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.