Was bedeuten die beiden Zahlen in den "a + b records" -Statistiken von dd?

16

Die ersten 2 Zeilen in der ddStatistik haben folgendes Format:

a+b records in
c+d records out

Warum 2 numerische Werte? Was bedeutet dieses Pluszeichen? Normalerweise a+0, aber manchmal, wenn ich größere Blöcke verwende, druckt dd0+b records out

Becken
quelle

Antworten:

16

Dies bedeutet volle Blöcke dieser bsGröße plus zusätzliche Blöcke mit einer Größe, die kleiner als das bs ist.

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

Edit : In der Antwort von frostschutz wird ein weiterer Fall erwähnt, bei dem nicht vollständige Blöcke generiert werden. Lesenswert. Siehe auch /unix//a/17357/73443 .

Arthur2e5
quelle
10

0+b records outDenn b>1in der Regel werden beim Lesen aus einer Pipe oder einer anderen Quelle, die nicht bs=Xschnell genug Daten liefern kann, unvollständige Lesevorgänge durchgeführt . Mit können Sie das ddWarten auf vollständige Datenblöcke erzwingen iflag=fullblock. Diese Option ist besonders nützlich, wenn Sie count=Xals Anzahl auch unvollständige Blöcke verwenden, sodass sie ohne vollständigen Block unzuverlässig ist.

Frostschutz
quelle
4

Es gibt Dutzende von Standardbefehlszeilenprogrammen, die an einem Deskriptor hängen und auf Eingaben warten können. So arbeiten sie alle. ddist einzigartig, da es Ihnen zeigen kann , was sieht ein Beschreiber wie gerade jetzt .

Persönlich verstehe ich den Nutzen der GNU- iflag=fullblockOption nicht wirklich . Ich meine, Sie können catIhre Eingabe genauso einfach und ohne sich um die I / O-Blockgrößen kümmern zu müssen.

Aber ddkann einen nehmen Teil eines Baches - und es kann es tun read()/ write()auf einer halbwegs modernen Systemgrenzen.

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

ddFührt einen Single read()per Input Block aus. Wenn die Datei , um es versucht , read()nicht so viele Daten hat , wie es angefordert hat es keine Rolle, - die man read() zählt als ein Block von Eingang. So funktioniert es - das ist ddder Hauptnutzen.

Wenn es seine Arbeit erledigt hat, ddmeldet es alle Ein- / Ausgabeblöcke, mit denen es sich befasst hat. Führen Sie den obigen Befehl erneut aus, aber löschen Sie stattdessen 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

Jedes Mal ddwar read(0,&in,64) readkam kurz zurück - weil seine stdin Dateideskriptor nicht genug Bytes hatte warten , dass es seine Anforderung zu erfüllen , wenn sie es geschafft. Also dd read()0 vollständige Eingabedatensätze und 2 kurze. Das ist es, was diese Berichte bedeuten.

mikeserv
quelle