Что означают эти два числа соответственно в статистике dd «a + b records»?

16

Первые 2 строки в ddстатистике имеют следующий формат:

a+b records in
c+d records out

Почему 2 числовые значения? Что означает этот знак плюс? Обычно a+0, но иногда, когда я использую больший размер блока, dd печатает0+b records out

бассейн
источник

Ответы:

16

Это означает, что полные блоки этого bsразмера плюс дополнительные блоки с размером меньше, чем 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

Изменить : ответ frostschutz упоминает еще один случай для создания неполных блоков. Стоит прочтения. Смотрите также /unix//a/17357/73443 .

Arthur2e5
источник
10

0+b records outдля b>1, как правило , неполными читает при чтении из трубы или другого источника , который не может предоставить bs=Xданные достаточно быстро. Вы можете заставить ddждать полные блоки данных, используя iflag=fullblock. Эта опция особенно полезна, если вы также используете, count=Xпоскольку count также считает неполные блоки, поэтому ненадежен без полных блоков ...

frostschutz
источник
4

Существуют десятки стандартных утилит командной строки, которые могут зависать в дескрипторе и ждать ввода. Вот как они все работают. ddуникален тем, что может показать вам, как выглядит дескриптор прямо сейчас .

Лично я не очень понимаю полезность iflag=fullblockопции GNU . Я имею в виду, что вы можете просто catвводить данные по крайней мере так же легко и без необходимости беспокоиться о размерах блоков ввода-вывода.

Но ddможет принять участие в потоке - и он может сделать это в read()/ write()границ в достаточно современной системе.

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

dd делает один read() на входной блок. Если файл, который он пытается read()найти, не имеет столько данных, сколько он запрашивал, это не имеет значения - он read() считается одним блоком ввода. Вот как это работает - этоdd основная утилита.

Когда он выполнит свою работу, ddсообщает о всех блоках ввода / вывода, с которыми он имел дело. Повторное выполнение вышеуказанной команды, но вместо этого удаление 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

Каждый раз , когда ddже read(0,&in,64) readвернулся коротко - потому что его дескриптор STDIN файл не был достаточно байт ожидания для того , чтобы выполнить его просьбу , когда он сделал это. И такdd read() 0 полных входных записей и 2 коротких. Вот что значат эти отчеты.

mikeserv
источник