Майкл Джонсон - Разработка приложений в среде Linux. Второе издание
- Название:Разработка приложений в среде Linux. Второе издание
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2007
- Город:Москва
- ISBN:978-5-8459-1143-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Майкл Джонсон - Разработка приложений в среде Linux. Второе издание краткое содержание
Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.
Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.
Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Виртуальные консоли предлагают пользователям множество опций, однако многие пренебрегают ними и просто используют X Window System. Те пользователи, которые предпочитают применять VC, имеют перечисленные ниже возможности.
• Выбор отдельного шрифта для каждой VC.
• Выбор индивидуального размера терминала в каждой VC.
• Выбор соответствий ключа (подробнее об этом далее) для всех VC.
• Выбор различных клавиатурных кодировок для всех VC.
• Переключение виртуальных консолей при помощи особых нажатий клавиш, установленных пользователем.
Проект документации Linux (Linux Documentation Project — LDP) предлагает документацию, объясняющую, как использовать существующие программы, извлекая все преимущества описанных возможностей. Перед вами стоит другая цель — вы хотите программировать для VC, а не просто их использовать. В утилитах [150] Прочтите man-страницы для утилит loadkeys , dumpkeys , keytables , setfont и mapscrn .
хорошо инкапсулированы установки шрифтов и клавиатуры, поэтому вы можете просто вызывать их из своих программ. Однако встречаются ситуации, в которых такие внешние программы бесполезны.
20.1. Начало работы
Ниже приведен список тех действий, которые вы можете производить над VC. Некоторые из них относятся только к отдельной виртуальной консоли (как правило, к той, которая активна в данный момент); некоторые используются для всех работающих VC.
• Найти текущую VC.
• Инициировать переключение VC.
• Отклонить или принять переключение VC.
• Полностью запретить переключение VC.
• Найти неиспользуемую VC.
• Динамически назначить или освободить память VC в ядре.
• Генерировать простые звуки.
Во всех случаях необходима одна и та же подготовительная работа. Вы будете применять команды ioctl()
на /dev/tty
— поэтому нужно начать с включения заголовочных файлов, которые определяют аргументы ioctl()
.
#include
#include
#include
#include
#include
После этого нужно открыть /dev/tty
.
if ((fd = open("/dev/tty", O_RDWR)) < 0) {
perror("myapp: не удается открыть /dev/tty");
exit(1);
}
Если вы обнаруживаете, что не можете открыть /dev/tty
, то, возможно, у вас проблемы с полномочиями: устройство /dev/tty
должно быть доступно для чтения и записи всем без исключения.
Обратите внимание на то, что в качестве дополнения к ioctl.h
существуют два главных заголовочных файла, в которых определены вызовы ioctl()
, обрабатывающие VC. В файле vt.h
определяются вызовы, начинающиеся с букв VT
, и реализуется управление виртуальным терминалом (экраном), как частью виртуальных консолей. В файле kd.h
определены вызовы, которые начинаются с KD
и обрабатывают клавиатуру и шрифты. Почти все содержимое kd.h
можно проигнорировать, поскольку эти функциональные возможности прекрасно инкапсулируются в утилитах. Однако оно окажется весьма полезным при выдаче звуковых сигналов консолью на управляемых частотах.
Данные основные заголовочные файлы также определяют структуры, которые используются с ioctl()
.
Структура vt_mode
применяется для поиска и изменения текущей VC:
struct vt_mode {
char mode;
char waitv;
short relsig;
short acqsig;
short frsig;
};
• Переменная mode
принимает одно из двух значений: VT_AUTO
(вынуждает ядро автоматически переключать консоли во время нажатия клавиш или при получении запроса от программы на переключение VC) или VT_PROCESS
(предписывает ядру запрашивать подтверждение прежде чем переключать консоли).
• Переменная waitv
не используется, однако для совместимости с SVR4 ей нужно присвоить значение 1
.
• Переменная relsig
именует сигнал, который должно сгенерировать ядро для передачи в процесс запроса на освобождение VC.
• Переменная acqsig
именует сигнал, который должно сгенерировать ядро для извещения процесса о том, что он получает VC.
• Переменная frsig
не используется, однако для совместимости с SVR4 ей нужно присвоить значение 0
.
struct vt_stat {
unsigned short v_active;
unsigned short v_signal;
unsigned short v_state;
};
• Переменная v_active
хранит количество VC, активных в данный момент.
• Переменная v_signal
не реализована.
• Переменная v_state
хранит битовую маску, сообщающую, какие из первых 16 VC открыты в данный момент (в системе Linux поддерживается до 63 VC). В системе Linux редко появляется смысл консультироваться с данной маской, поскольку она недостаточно велика, чтобы содержать полную информацию. В большинстве случаев вам понадобится знать только номера ряда открытых консолей, которые вы можете извлечь с помощью функции VT_OPENQRY
(рассматривается далее в этой главе).
20.2. Выдача звукового сигнала
Заставить консоль генерировать звуковой сигнал в течение определенного периода времени на указанной частоте совсем не сложное дело. Для этого существуют два способа. Первый состоит во включении или отключении постоянной тональной посылки. Команда KIOCSOUND
отключает звук, если ее аргумент равен нулю. В противном случае она устанавливает частоту звука (причем довольно необычным способом, как показано в следующем коде).
void turn_tone_on(int fd, int hertz) {
ioctl(fd, KIOCSOUND, 1193180/hertz)
}
void turn_tone_off(int fd) {
ioctl(fd, KIOCSOUND, 0)
}
Вторым вариантом для выдачи консолью звукового сигнала является применение команды управления вводом-выводом KDMKTONE
. Она включает тональную посылку на время, указанное в тиках системных часов (jiffy). К сожалению, время одного тика в различных архитектурах разное. Макрос HZ
, определенный sys/param.h
, позволяет получить количество тиков в секунду. Функция tone()
, показанная ниже, демонстрирует, как извлекать количество тиков в сотых долях секунды и значение макроса HZ
[151] Данный интерфейс имеет недостаток. Для него необходимо устанавливать некоторые постоянные доли секунды и осуществлять преобразование. Макрос HZ больше не является константой даже на отдельной платформе. Однако, по крайней мере, для архитектуры Intel i86 Линус Торвальдс установил, что все определенные интерфейсы в отношении HZ должны представлять синтетический интерфейс в 100 Гц. Возможно, что в будущем периодические системные часы исчезнут, в таком случае тики станут полностью искусственным понятием.
.
#include
void tone(int fd, int hertz, int hundredths) {
unsigned int ticks = hundredths * HZ / 100;
/* ticks & 0xffff не будет работать, если ticks — 0xf0000;
* вместо этого нужно округлить до наибольшего допустимого значения */
if (ticks > 0xffff) ticks = 0xffff;
Интервал:
Закладка: