Cosa significano rispettivamente i due numeri nelle statistiche "a + b records" di dd?


16

Le prime 2 righe nelle ddstatistiche hanno il seguente formato:

a+b records in
c+d records out

Perché 2 valori numerici? Cosa significa questo segno più? Di solito è a+0, ma a volte quando uso blocchi di dimensioni maggiori, stampe dd0+b records out

Risposte:


16

Significa blocchi interi di quella bsdimensione più blocchi extra con dimensioni inferiori alla 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

Modifica : la risposta di frostschutz menziona un altro caso per generare blocchi non completi. Vale la pena leggere. Vedi anche /unix//a/17357/73443 .


10

0+b records outpoiché di b>1solito sono letture incomplete durante la lettura da una pipe o da un'altra fonte che non è in grado di fornire bs=Xdati abbastanza rapidamente. È possibile forzare ddl'attesa di blocchi completi di dati utilizzando iflag=fullblock. Questa opzione è particolarmente utile se stai usando anche count=Xcome count conta anche i blocchi incompleti quindi non è affidabile senza fullblock ...


4

Esistono dozzine di utility standard da riga di comando che possono essere bloccate su un descrittore e attendere l'input. È praticamente come funzionano tutti. ddè unico in quanto può mostrarti come appare un descrittore in questo momento .

Personalmente, non capisco davvero l'utilità dietro l' iflag=fullblockopzione GNU . Voglio dire, puoi solo catinserire i tuoi dati almeno altrettanto facilmente e senza doversi preoccupare delle dimensioni dei blocchi di I / O.

Ma ddpuò prendere parte di un flusso - e può farlo a read()/ write()confini su un sistema ragionevolmente moderno.

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

ddfa un singolo read()per blocco di input. Se il file che tenta di read()non avere tutti i dati richiesti non ha importanza: quello read() conta come un blocco di input. Funziona così: questa è ddl'utilità principale.

Quando ha fatto il suo lavoro, ddriporta tutti i blocchi di input / output che ha affrontato. Eseguendo nuovamente il comando sopra, ma stdout invece stavolta ...


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

Ogni volta che ddsi read(0,&in,64) readè tornato a breve - perché il suo descrittore di file stdin non ha avuto abbastanza byte in attesa di adempiere la sua richiesta, quando ha fatto. E così dd read()0 record di input completi e 2 brevi. Questo è ciò che significano quei rapporti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.