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
для менш випадкового "випадкового" значення або перевірте свій пул ентропії (в циклі, і зачекайте, як потрібно) ...