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=цель вообще читаема, это всегда будет приводить к выходному файлу одинакового размера, потому что 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()s, которые делает первое, будут соответствовать его размеру блока ввода / вывода - независимо от того, сколько read()s ddдолжно сделать первое , чтобы сделать это.
И что «S , как вы можете использовать , ddчтобы надежно прочитанные трубы или другие тип специальных файлов - с помощью всего лишь немного математики.
/dev/randomбудет блокироваться, если энтропии недостаточно для создания необходимого количества цифр. это просто нужно время , чтобы собрать такое количество высококачественной псевдо случайной «случайность» ... Либо использовать/dev/urandomдля менее случайного «случайного» значения, или проверить пул энтропии (в цикле, и ждать , как потребность быть) ...