Марк Митчелл - Программирование для Linux. Профессиональный подход
- Название:Программирование для Linux. Профессиональный подход
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2002
- Город:Москва
- ISBN:5-8459-0243-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Марк Митчелл - Программирование для Linux. Профессиональный подход краткое содержание
Данная книга в основном посвящена программированию в среде GNU/Linux. Авторы применяют обучающий подход, последовательно излагая самые важные концепции и методики использования расширенных возможностей системы GNU/Linux в прикладных программах. Читатели научатся писать программы, к интерфейсу которых привыкли пользователи Linux; освоят такие технологии, как многозадачность, многопотоковое программирование, межзадачное взаимодействие и взаимодействие с аппаратными устройствами; смогут улучшить свои программы, сделав их быстрее, надежнее и безопаснее; поймут особенности системы GNU/Linux, ее ограничения, дополнительные возможности и специфические соглашения.
Книга предназначена для программистов, уже знакомых с языком С и имеющих базовый опыт работы в GNU/Linux.
Программирование для Linux. Профессиональный подход - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Ссылка на устройство создается с помощью команды 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] Принтер может требовать, чтобы в конце каждой строки стоял символ возврата каретки (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
.
Интервал:
Закладка: