20.1. Начало работы

We use cookies. Read the Privacy and Cookie Policy

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 (рассматривается далее в этой главе).