В Linux есть также ряд специальных символьных устройств, которым не соответствуют никакие аппаратные компоненты. Старший номер всех таких устройств равен 1. Это означает, что обращение к устройству переадресуется ядру Linux.
6.5.1. /dev/null
Устройство /dev/null служит двум целям.
■ Linux удаляет любые данные, направляемые в устройство /dev/null. В тех случаях, когда выводные данные программы не нужны, в качестве выходного файла назначают устройство /dev/null, например:
% verbose_command > /dev/null
■ При чтении из устройства /dev/null всегда возвращается признак конца строки. Если открыть файл /dev/null с помощью функции open() и попытаться прочесть данные из него с помощью функции read(), функция вернет 0 байтов. При копировании файла /dev/null в другое место будет создан пустой файл нулевой длины:
% cp /dev/null empty-file
% ls -l empty-file
-rw-rw---- 1 samuel samuel 0 Mar 8 00:27 empty-file
6.5.2. /dev/zero
Устройство /dev/zero ведет себя так, как если бы оно было файлом бесконечной длины, заполненным одними нулями. Сколько бы данных ни запрашивалось из этого файла, ОС Linux "сгенерирует" достаточное количество кулевых байтов.
Чтобы проверить это, запустите программу hexdump, представленную в листинге Б.4 приложения Б, "Низкоуровневый ввод-вывод". Программа отображает содержимое файла /dev/zero в шестнадцатеричном виде:
% ./hexdump /dev/zero
0x000000 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x000010 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x000020 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x000030 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
...
Чтобы прервать работу программы, нажмите <Ctrl+C>.
Файл /dev/zero используется в функциях выделения памяти, которые отображают этот файл в памяти, чтобы инициализировать выделяемые сегменты нулями. Об этом рассказывается в разделах 5,3.5, "Другие применения функции mmap()", и 8.9. "Функция mprotect(): задание прав доступа к памяти".
6.5.3. /dev/full
Устройство /dev/full ведет себя так, как если бы оно было файлом в файловой системе, где не осталось свободного места. Операция записи в этот файл завершается ошибкой, и в переменную errno помещается код ENOSPC, обычно свидетельствующий о том, что устройство записи переполнено.
Вот что получится, если попытаться осуществить запись в устройство /dev/full с помощью команды cp:
% cp /etc/fstab /dev/full
cp: /dev/fulclass="underline" No space left on device
Этот файл удобен для проверки того, как программа будет вести себя в случае, если при записи в файл возникнет нехватка места.
6.5.4. Устройства генерирования случайных чисел
Специальные устройства /dev/random и /dev/urandom предоставляют доступ к средствам генерирования случайных чисел, встроенным в ядро Linux.
Большинство аналогичных программных функций, например функция rand() стандартной библиотеки языка С, в действительности генерируют псевдослучайные числя. Такие числа имеют некоторые свойства случайных последовательностей, но их можно воспроизвести: достаточно задать то же самое инициализирующее значение, чтобы получить одинаковую последовательность чисел. Такое поведение неизбежно, ведь внутренняя работа компьютера жестко определена и предсказуема. Но в ряде приложений это крайне нежелательно. Например, можно взломать криптографический шифр, если воспроизвести последовательность случайных чисел, лежащих в его основе.
Чтобы получить настоящие случайные числа, необходим внешний "источник хаоса". Ядро Linux знает о таком источнике: это вы сами! Замеряя задержки между действиями пользователя, в частности нажатиями клавиш и перемещениями мыши, ядро способно генерировать непредсказуемый поток действительно случайных чисел. Получить доступ к этому потопу можно путем чтения из устройств /dev/random и /dev/urandom.
Разница между устройствами проявляется, когда запас случайных чисел в ядре Linux заканчивается. Если попытаться прочесть большое количество байтов из устройства /dev/random и при этом не выполнять никаких пользовательских действий (не нажимать клавиши, не перемещать мышь и т.п.), система заблокирует операцию чтения. Только когда пользователь проявит какую-то активность, система сгенерирует дополнительные случайные числа и передаст их программе.
Попытайтесь, к примеру, отобразить содержимое файла /dev/random с помощью команды od.[20] В каждой строке выходных данных содержится 16 случайных байтов.
20
Мы могли бы использовать программу hexdump вместо команды od, так как они делают, по сути, одно и то же. Но когда входной поток исчерпывается, программа hexdump завершается, а команда od переходит в режим ожидания. Опция -t x1 сообщат команде od о том, что содержимое файла должно отображаться в шестнадцатеричном формате.