Ссылки на устройства напоминают обычные файлы. Их можно перемещать с помощью команды mv
и удалять командой rm
. Правда, если попытаться скопировать такую ссылку с помощью команды cp
, из устройства будут прочитаны данные (при условии что устройство поддерживает операцию чтения) и эти данные перенесутся в указанный файл. При попытке перезаписи ссылки в соответствующее устройство будут записаны данные.
Ссылка на устройство создается с помощью команды mknod
(документация вызывается так. man 1 mknod
) или функции mknod()
(документация вызывается так: man 2 mknod
). Создание ссылки не означает, что драйвер устройства или само устройство автоматически станут доступными. Ссылка является лишь своего рода порталом, через который происходит взаимодействие с драйвером. Создавать такие ссылки разрешается только процессам суперпользователя.
Первый аргумент команды mknod
задает путь, под которым ссылка появится в файловой системе. Второй аргумент равен b
для блочного устройства и с
для символьного устройства. Старший и младший номера устройства задаются в третьем и четвертом аргументах соответственно. Например, следующая команда создает в текущем каталоге ссылку на символьное устройство lp0
. Старший номер устройства — 6, младший — 0. Эти номера соответствуют первому параллельному порту Linux.
% mknod ./lp0 с 6 0
Помните, что лишь суперпользователю разрешено создавать ссылки на устройства, поэтому для успешного выполнения показанной команды необходимо зарегистрироваться в системе под именем root
.
Команда ls
особым образом помечает ссылки на устройства. Если вызвать ее с флагом -l
или -o
, то первый символ в каждой строке будет обозначать тип записи. Знак -
(дефис) соответствует обычному файлу, буква d
— каталогу, b
— блочному устройству, c
— символьному устройству. В последних двух случаях команда ls
вместо размера файла отображает старший и младший номера устройства. Давайте, к примеру, получим информацию о ссылке на символьное устройство, которую мы только что создали:
% ls -l lp0
crw-r----- 1 root root 6, 0 Mar 7 17:03 lp0
В распоряжении программ имеется функция stat()
, которая позволяет не только узнать, какому устройству — символьному или блочному— соответствует ссылка, но и определить номера устройства. Эта функция описана в приложении Б, "Низкоуровневый ввод-вывод".
Удалить ссылку на устройство (не сам драйвер) можно с помощью команды rm
:
% rm ./lp0
6.3.1. Каталог /dev
В Linux имеется каталог /dev
, в котором содержатся ссылки на все символьные и блочные устройства, известные системе. Имена этих ссылок стандартизированы
Например, главное устройство, подключенное к основному контроллеру IDE, имеет старший и младший номера 3 и 0 соответственно, а его стандартное имя — /dev/hda
. Если данное устройство поддерживает разделы, то первый раздел (младший номер 1) будет называться /dev/hda1
. Проверим это:
% ls -l /dev/hda /dev/hda1
brw-rw---- 1 root disk 3, 0 May 5 1998 /dev/hda
brw-rw---- 1 root disk 3, 1 May 5 1998 /dev/hda1
Здесь же будет находиться и ссылка на параллельный порт, которую мы создали выше:
% ls -l /dev/lp0
crw-rw---- 1 root daemon 6, 0 May 5 1998 /dev/lp0
В большинстве случаев нет необходимости с помощью команды mknod
создавать собственные ссылки. Достаточно скопировать нужные ссылки из каталога /dev
. У программ, не располагающих привилегиями суперпользователя, нет другого выбора, кроме как пользоваться имеющимися ссылками. Обычно новые ссылки создаются только системными администраторами и разработчиками драйверов. В Linux имеются специальные средства, упрощающие администраторам процесс создания ссылок с правильными именами.
6.3.2. Доступ к устройству путем открытия файла
Как работать с аппаратными устройствами? В случае символьного устройства ответ прост: откройте ссылку на устройство как обычный файл и осуществляйте чтение-запись традиционным образом. Например, если к первому параллельному порту подключен принтер, то распечатать файл document.txt
можно, направив его непосредственно на устройство /dev/lp0
:
% cat document.txt > /dev/lp0
Чтобы эта команда завершилась успешно, необходимо иметь право записи в файл принтера. Во многих Linux-системах таким правом обладают лишь пользователь root
и системный демон печати (lpd
). Кроме того, результат работы принтера зависит от того, как он интерпретирует посылаемые ему данные. Одни принтеры распечатывают текстовые файлы,[18] другие — нет. PostScript-принтеры распечатывают файлы формата PostScript.