• Выбор отдельного шрифта для каждой VC.
• Выбор индивидуального размера терминала в каждой VC.
• Выбор соответствий ключа (подробнее об этом далее) для всех VC.
• Выбор различных клавиатурных кодировок для всех VC.
• Переключение виртуальных консолей при помощи особых нажатий клавиш, установленных пользователем.
Проект документации Linux (Linux Documentation Project — LDP) предлагает документацию, объясняющую, как использовать существующие программы, извлекая все преимущества описанных возможностей. Перед вами стоит другая цель — вы хотите программировать для VC, а не просто их использовать. В утилитах [150] Прочтите man-страницы для утилит loadkeys , dumpkeys , keytables , setfont и mapscrn .
хорошо инкапсулированы установки шрифтов и клавиатуры, поэтому вы можете просто вызывать их из своих программ. Однако встречаются ситуации, в которых такие внешние программы бесполезны.
Ниже приведен список тех действий, которые вы можете производить над 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
(рассматривается далее в этой главе).
Читать дальше