Co te dwie liczby oznaczają odpowiednio w statystykach „a + b records” dd?

16

Pierwsze 2 wiersze w ddstatystykach mają następujący format:

a+b records in
c+d records out

Dlaczego 2 wartości liczbowe? Co oznacza ten znak plus? Zwykle a+0, ale czasami kiedy używam większego rozmiaru bloku, drukuje dd0+b records out

basen
źródło

Odpowiedzi:

16

Oznacza to pełne bloki tego bsrozmiaru plus dodatkowe bloki o rozmiarze mniejszym niż 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

Edycja : odpowiedź frostschutz wspomina o innym przypadku generowania niepełnych bloków. Warte przeczytania. Zobacz także /unix//a/17357/73443 .

Arthur2e5
źródło
10

0+b records outo b>1zwykle niepełna odczytuje podczas odczytu rury lub innego źródła, które nie mogą zapewnić bs=Xdane wystarczająco szybko. Możesz zmusić dddo czekania na pełne bloki danych za pomocą iflag=fullblock. Ta opcja jest szczególnie przydatna, jeśli również używasz, count=Xponieważ liczenie zlicza również niekompletne bloki, więc jest zawodna bez pełnego bloku ...

frostschutz
źródło
4

Istnieją dziesiątki standardowych narzędzi wiersza poleceń, które mogą zawiesić się na deskryptorze i czekać na dane wejściowe. Tak właśnie działają wszystkie. ddjest wyjątkowy, ponieważ może pokazać, jak wygląda teraz deskryptor .

Osobiście tak naprawdę nie rozumiem przydatności iflag=fullblockopcji GNU . Chodzi mi o to, że możesz catwprowadzić dane wejściowe przynajmniej tak łatwo i bez obaw o rozmiary bloków we / wy.

Ale ddmoże wziąć udział strumienia - i może to zrobić w read()/ write()granice na rozsądnie nowoczesnego systemu.

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

ddrobi jeden read()na blok wejściowy. Jeśli plik stara się read()nie mieć jak najwięcej danych, jak zażądał to nie ma znaczenia - na jedno read() liczy się jako jeden blok wejścia. Tak to działa - to ddpodstawowe narzędzie.

Kiedy wykona swoją pracę, ddraporty o wszystkich blokach wejścia / wyjścia, z którymi się uporał. Ponownie uruchom powyższe polecenie, ale tym razem upuszczając standardowe wyjście ...


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

Za każdym razem ddnie read(0,&in,64) readwrócił krótko - bo jego deskryptor stdin nie mają wystarczająco dużo bajtów czeka na to, aby pełnić swoją prośbę, gdy udało. I tak dd read()0 pełnych rekordów wejściowych i 2 krótkie. To właśnie oznaczają te raporty.

mikeserv
źródło