ddбуде призначений для блокування - це, як правило , найкращий інструмент у вашому розпорядженні для читання вхідних змінних розмірів , якщо вам це потрібно зробити негайно , бо ddНЕ буде поточний буфер читає в якій - то майбутнє write() (якщо ви дуже явно не налаштувати його таким чином з більшими набл ніж СРК) , але буде замість цього write()все, що він читає, як тільки він read()це (і необов'язково обробляє) .
Ось кілька важливих визначень :
ibs=expr
- Вкажіть розмір блоку введення в байтах за (за замовчуванням 512) .
expr
obs=expr
- Вкажіть розмір вихідного блоку в байтах за (за замовчуванням 512) .
expr
bs=expr
- Встановіть розміри блоку вводу та виводу на
exprбайти, заміщення ibs=та obs=. Якщо перетворення, окрім sync, noerrorта notruncне вказане, кожен блок введення повинен бути скопійований на вихід у вигляді одного блоку без агрегування коротких блоків.
Отже, ви бачите, коли ibsі obsвизначаються разом, як bsтоді, ibsмає перевагу - але в іншому випадку, якщо ви конкретні, то obsабо є cbs.
Ось приклад, в якому ibsнайважливіше. Ви можете зробити щось подібне, якби хотіли відстежити, як швидко /dev/randomбасейн заповниться ...
dd "ibs=$size" conv=sync "count=$lmt" \
if=/dev/random of="$somefile"
Поки if=ціль 's читається взагалі, це завжди призведе до виходу одного розміру файлу, тому що ddбуде syncгарно блокувати зчитування блоків на нулі. Іншими словами, якщо dd read()s для вхідного блоку $((size=10)) $((count=5))разів, і read()файл повертає 2 байти, то 8 байт, потім 12 байт, потім 2 байти, потім 4 байти, ddзапише у свій аутфіл щось подібне
2 read bytes 8NULs \
8 read bytes 2NULs \
10 read bytes 0NULs \
4 read bytes 6NULs \
4 read bytes 6NULs
... тому що ddза замовчуванням не затримується. Тож якщо вам потрібно відстежувати вхідний потік та розмежувати записи якогось іншого процесу, ddце інструмент для вас.
Якщо ви просто записуєте деякий обсяг даних у звичайний файл, тоді, всупереч іншим заявам, викладеним тут, ви також можете використовувати ddдля цього - і досить легко - але вам знадобиться більше, ніж один і надійний фактор блокування .
Наприклад, якщо ви зробили це:
{ dd ibs="$size" obs="${size}x$block_factor" |
dd bs="${size}x$blockfactor" "count=$lmt"
} <infile >outfile
... перший ddби буферував стільки ibs="$size"вхідних блоків, скільки було потрібно для заповнення принаймні одного obs="${size}x$block_factor"блоку виходу для кожної write()труби між нею і другою dd. Це означає, що другий ddможе надійно обмежувати вихід, count="$lmt"тому що всі, write()які робить перший, збігаються з його блоком вводу-виводу - незалежно від кількості read()s, який ddповинен зробити перший , щоб зробити його таким.
І що «S , як ви можете використовувати , ddщоб надійно прочитані труби або інші тип спеціальних файлів - з допомогою всього лише трохи математики.
/dev/randomзаблокується, якщо не вистачить ентропії, щоб генерувати потрібну кількість цифр. просто потрібен час, щоб зібрати цю кількість високоякісної psuedo випадкової "випадковості" ... Або скористайтеся/dev/urandomдля менш випадкового "випадкового" значення або перевірте свій пул ентропії (в циклі, і зачекайте, як потрібно) ...