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
для менее случайного «случайного» значения, или проверить пул энтропии (в цикле, и ждать , как потребность быть) ...