, так как они делают, по сути, одно и то же. Но когда входной поток исчерпывается, программа
hexdump
завершается, а команда
od
переходит в режим ожидания. Опция
– t x1
сообщат команде
od
о том, что содержимое файла должно отображаться в шестнадцатеричном формате.
Число строк в выводе команды будет разным (их может оказаться очень мало). Главное то, что, в конце концов, вывод прекратится, поскольку операционная систем исчерпает запас случайных чисел. Попробуйте теперь переместить мышь или нажать что-нибудь на клавиатуре, и вы увидите, что появляются новые случайные числа.
В противоположность этому операция чтения из устройства
/dev/urandom
никогда не блокируется. Если в системе кончаются случайные числа, Linux использует криптографический алгоритм, чтобы сгенерировать псевдослучайные числа из последней цепочки случайных байтов.
Следующая команда будет выполняться до тех пор. пока пользователь не нажмет <Ctrl+C>:
% od -t x1 /dev/urandom
0000000 62 71 d6 3e af dd de 62 c0 42 78 bd 29 9c 69 49
0000020 26 3b 95 be b9 6c 15 16 38 fd 7e 34 f0 ba ее c3
Поучить доступ в программе к генератору случайных чисел несложно. В листинге 6.1 показана функция, которая генерирует случайное число, читая байты из файла
/dev/random
. Помните, что операция чтения из этого файла окажется заблокированной в случае нехватки случайных чисел. Если важна скорость работы функции и можно смириться с тем, что некоторые числа окажутся псевдослучайными, воспользуйтесь файлом
/dev/urandom
.
Листинг 6.1. (random_number.c) Генерирование случайного числа с помощью файла
/dev/random
#include <assert.h>
#include <sys/stat.h>
#include <sys/types.h
#include <fcntl.h>
#include <unistd.h>
/* Функция возвращает случайное число в диапазоне от MIN до МАХ
включительно. Случайная последовательность байтов читается из
файла /dev/random. */
int random_number(int min, int max) {
/* Дескриптор файла /dev/random сохраняется в статической
переменной, чтобы не приходилось повторно открывать файл
при каждом следующем вызове
функции. */
static int dev_random_fd = -1;
char* next_random_byte;
int bytes_to_read;
unsigned random_value;
/* Убеждаемся, что аргумент MAX больше, чем MIN. */
assert(max > min);
/* Если функция вызывается впервые, открываем файл /dev/random
и сохраняем его дескриптор. */
if (dev_random_fd == -1) {
dev_random_fd = open("/dev/random", O_RDONLY);
assert(dev_random_fd != -1);
}
/* Читаем столько байтов, сколько необходимо для заполнения
целочисленной переменной. */
next_random_byte = (char*)&random_value;
bytes_to_read = sizeof(random_value);
/* Цикл выполняется до тех пор, пока не будет прочитано
требуемое количество байтов. Поскольку файл /dev/random
заполняется в результате пользовательских действий,
при длительном отсутствии активности операция чтения
/* Вычисляем случайное число в правильном диапазоне. */
return min + (random_value % (max - min + 1));
}
6.5.5. Устройства обратной связи
Устройство обратной связи позволяет сымитировать блочное устройство с помощью обычного дискового файла. Представьте жесткий диск, в котором данные находятся не в дорожках и секторах, а в файле с именем
disk-image
(естественно, сам этот файл должен размещаться на реальном диске, размер которого больше имитируемого).
Устройства обратной связи называются
/dev/loop0
,
/dev/loop1
и т.д. Каждому из них соответствует одно виртуальное блочное устройство. Создавать такие устройства может только суперпользователь.
Устройство обратной связи используется так же, как и любое другое блочное устройство. В частности, на нем можно создать файловую систему и смонтировать ее подобно файловой системе обычного диска или раздела. Такая файловая система, целиком размещаемая в дисковом файле, называется виртуальной файловой системой (ВФС).
Ниже описана последовательность действий, которые необходимо выполнить, чтобы создать виртуальную файловую систему и смонтировать ее на устройстве обратной связи.