Первые 2 строки в dd
статистике имеют следующий формат:
a+b records in
c+d records out
Почему 2 числовые значения? Что означает этот знак плюс? Обычно a+0
, но иногда, когда я использую больший размер блока, dd печатает0+b records out
Это означает, что полные блоки этого 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 .
0+b records out
для b>1
, как правило , неполными читает при чтении из трубы или другого источника , который не может предоставить bs=X
данные достаточно быстро. Вы можете заставить dd
ждать полные блоки данных, используя iflag=fullblock
. Эта опция особенно полезна, если вы также используете, count=X
поскольку count также считает неполные блоки, поэтому ненадежен без полных блоков ...
Существуют десятки стандартных утилит командной строки, которые могут зависать в дескрипторе и ждать ввода. Вот как они все работают. 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 коротких. Вот что значат эти отчеты.