20.1. Начало работы
20.1. Начало работы
Ниже приведен список тех действий, которые вы можете производить над VC. Некоторые из них относятся только к отдельной виртуальной консоли (как правило, к той, которая активна в данный момент); некоторые используются для всех работающих VC.
• Найти текущую VC.
• Инициировать переключение VC.
• Отклонить или принять переключение VC.
• Полностью запретить переключение VC.
• Найти неиспользуемую VC.
• Динамически назначить или освободить память VC в ядре.
• Генерировать простые звуки.
Во всех случаях необходима одна и та же подготовительная работа. Вы будете применять команды ioctl() на /dev/tty — поэтому нужно начать с включения заголовочных файлов, которые определяют аргументы ioctl().
#include <signal.h>
#include <sys/ioctl.h>
#include <sys/vt.h>
#include <sys/kd.h>
#include <sys/param.h>
После этого нужно открыть /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 (рассматривается далее в этой главе).