6.3.2. Доступ к устройству путем открытия файла
Как работать с аппаратными устройствами? В случае символьного устройства ответ прост: откройте ссылку на устройство как обычный файл и осуществляйте чтение-запись традиционным образом. Например, если к первому параллельному порту подключен принтер, то распечатать файл document.txt
можно, направив его непосредственно на устройство /dev/lp0
:
% cat document.txt > /dev/lp0
Чтобы эта команда завершилась успешно, необходимо иметь право записи в файл принтера. Во многих Linux-системах таким правом обладают лишь пользователь root
и системный демон печати ( lpd
). Кроме того, результат работы принтера зависит от того, как он интерпретирует посылаемые ему данные. Одни принтеры распечатывают текстовые файлы, [18] Принтер может требовать, чтобы в конце каждой строки стоял символ возврата каретки (ASCII-код 14), а в конце каждой страницы — символ подачи листа (ASCII-код 12).
другие — нет. PostScript-принтеры распечатывают файлы формата PostScript.
Послать устройству данные из программы несложно. В приведенном ниже фрагменте программы с помощью низкоуровневых функций ввода-вывода содержимое буфера направляется в устройство /dev/lp0
:
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
.
Читать дальше