Що означають ці два числа відповідно у статистиці "а + b" ДД?


16

Перші 2 рядки в ddстатистиці мають такий формат:

a+b records in
c+d records out

Чому 2 числові значення? Що означає цей знак плюс? Зазвичай a+0, але іноді, коли я використовую більший розмір блоку, друкується DD0+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 .


10

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


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 коротких запису. Ось що означають ці звіти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.