Марк Митчелл - Программирование для Linux. Профессиональный подход
int fd = open("/dev/lp0", O_WRONLY);
write(fd, buffer, bufffer_length);
close(fd);
6.4. Аппаратные устройства
В табл. 6.1 перечислены распространенные блочные устройства. "Родственные" устройства именуются схожим образом (например, второй раздел первого SCSI-диска называется /dev/sda2). Эта информация будет полезна при анализе файла /proc/mounts на предмет того, какие файловые системы смонтированы в настоящий момент (об этом рассказывается в разделе 7.5, "Дисководы, точки монтирования и файловые системы").
Таблица 6.1. Распространенные блочные устройства
Устройство Имя Старший номер Младший номер Первый дисковод гибких дисков /dev/fd0 2 0 Второй дисковод гибких дисков /dev/fd1 2 1 Основной IDE-контроллер, главное устройство /dev/hda 3 0 Основной IDE-контроллер, главное устройство, первый раздел /dev/hda1 3 1 Основной IDE-контроллер, подчиненное устройство /dev/hdb 3 64 Основной IDE-контроллер, подчиненное устройство, первый раздел /dev/hdb1 3 65 Дополнительный IDE-контроллер, главное устройство /dev/hdc 22 0 Дополнительный IDE-контроллер, подчиненное устройство /dev/hdd 22 64 Первый SCSI-диск /dev/sda 8 0 Первый SCSI-диск, первый раздел /dev/sda1 8 1 Второй SCSI диск /dev/sdb 8 16 Второй SCSI-диск, первый раздел /dev/sdb1 8 17 Первый SCSI-дисковод CD-ROM /dev/scd0 11 0 Второй SCSI-дисковод CD-ROM /dev/scd1 11 1В табл. 6.2 перечислены распространенные символьные устройства.
Таблица 6.2. Распространенные символьные устройства
Устройство Имя Старший номер Младший номер Параллельный порт 0 /dev/lp0 или /dev/par0 6 0 Параллельный порт 1 /dev/lp1 или /dev/par1 6 1 Первый последовательный порт /dev/ttyS0 4 64 Второй последовательный порт /dev/ttyS1 4 65 IDE-накопитель на магнитной ленте /dev/ht0 37 0 Первый SCSI-накопитель на магнитной ленте /dev/st0 9 0 Второй SCSI-накопитель на магнитной ленте /dev/st1 9 1 Системная консоль /dev/console 5 1 Первый виртуальный терминал /dev/tty1 4 1 Второй виртуальный терминал /dev/tty2 4 2 Текущее терминальное устройство процесса /dev/tty 5 0 Звуковая плата /dev/audio 14 4К некоторым аппаратным компонентам можно получить доступ сразу через несколько символьных устройств. Чаще всего этим устройствам соответствует разная семантика доступа. Например, если в системе есть ленточное IDE-устройство /dev/ht0, то Linux автоматически перематывает ленту в дисководе, когда программа закрывает дескриптор файла устройства. С помощью ссылки /dev/nht0 можно обратиться к тому же ленточному накопителю, но режим автоматической перемотки в нем будет отключен. Иногда в системе есть ссылки наподобие /dev/cua0. Это старые интерфейсы последовательных портов, таких как /dev/ttyS0.
Иногда требуется записывать данные непосредственно в символьные устройства. Рассмотрим примеры.
■ Терминальная программа напрямую обращается к модему через устройство последовательного порта. Данные, записываемые в устройство, передаются по модему на удаленный компьютер.
■ Программа резервного копирования записывает данные непосредственно на ленту. Такая программа может реализовывать свои собственные алгоритмы сжатия и проверки ошибок.
■ Программа обращается к первому виртуальному терминалу,[19] записывая данные в устройство /dev/tty1.
Терминальным окнам, работающим в графической среде, и окнам сеансов удаленной регистрации назначаются не виртуальные терминалы, а псевдотерминалы (о них говорится в разделе 6.6, "Псевдотерминалы")
■ Иногда программе требуется получить доступ к терминальному устройству, с которым она связана.
Например, программа может попросить пользователя ввести пароль. Из соображений безопасности требуется проигнорировать перенаправление стандартных потоков ввода и вывода и прочитать пароль с терминала независимо от того, как пользователь вызвал программу. Для этого можно открыть файл /dev/tty, всегда соответствующий текущему терминальному устройству процесса. Запишите в данный файл строку приглашения, а затем прочитайте пароль. Это не позволит пользователю передать программе пароль из файла с помощью следующего синтаксиса:
% secure_program < my-password.txt
■ Программа воспроизводит аудиофайл через звуковую плату, посылая аудиоданные в устройство /dev/audio. Эти данные должны быть представлены в формате Sun (такие файлы обычно имеют расширение .au).
Например, во многие дистрибутивы Linux входит файл /usr/share/sndconfig/sample.au. Попробуйте воспроизвести его с помощью такой команды:
% cat /usr/share/sndconfig/sample.au > /dev/audio
Те, кто хотят включить звук в свои программы, должны использовать специальные сервисы и библиотеки функций работы со звуком, имеющиеся в Linux. В графической среде Gnome есть демон EsounD (доступен по адресу http://www.tux.org/~riclude/EsounD.html), в KDE — программа aRts (http://space.twc.de/~stefan/kde/arts-mcop-doc/). Благодаря этим средствам приложения, обращающиеся к звуковой плате, лучше взаимодействуют друг с другом.
6.5. Специальные устройства
В Linux есть также ряд специальных символьных устройств, которым не соответствуют никакие аппаратные компоненты. Старший номер всех таких устройств равен 1. Это означает, что обращение к устройству переадресуется ядру Linux.
6.5.1. /dev/null
Устройство /dev/null служит двум целям.
■ Linux удаляет любые данные, направляемые в устройство /dev/null. В тех случаях, когда выводные данные программы не нужны, в качестве выходного файла назначают устройство /dev/null, например: