Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

• Переменная

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] .

151

Данный интерфейс имеет недостаток. Для него необходимо устанавливать некоторые постоянные доли секунды и осуществлять преобразование. Макрос

HZ
больше не является константой даже на отдельной платформе. Однако, по крайней мере, для архитектуры Intel i86 Линус Торвальдс установил, что все определенные интерфейсы в отношении
HZ
должны представлять синтетический интерфейс в 100 Гц. Возможно, что в будущем периодические системные часы исчезнут, в таком случае тики станут полностью искусственным понятием.

#include <sys/param.h>

void tone(int fd, int hertz, int hundredths) {

 unsigned int ticks = hundredths * HZ / 100;

 /* ticks & 0xffff не будет работать, если ticks — 0xf0000;

* вместо этого нужно округлить до наибольшего допустимого значения */

 if (ticks > 0xffff) ticks = 0xffff;

 /* еще одна ошибка округления */

 if (hundredths && ticks == 0) ticks = 1;

 ioctl(fd, KDMKTONE, (ticks << 16 | (1193180/hertz)));

}

20.3. Определение, является ли терминал виртуальной консолью

Для

того чтобы определить, является ли текущий терминал виртуальной консолью, можно открыть
/dev/tty
и применить
VT_GETMODE
для запроса режима:

struct vt_mode vtmode;

fd = open("/dev/tty", O_RDWR);

retval = ioctl (fd, VT_GETMODE, &vtmode);

if (retval < 0) {

 /* Данный терминал не является VC; выполните соответствующие действия */

}

20.4. Поиск текущей виртуальной консоли

Для извлечения номера текущей VC применяется команда управления вводом-выводом

VT_GETSTATE
, которая принимает указатель на структуру
struct vt_stat
и возвращает номер текущей консоли в ее элементе
v_active
.

unsigned short get_current_vc(int fd) {

 struct vt_stat vs;

 ioctl(fd, VT_GETSTATE, &vs);

 return(vs.v_active);

}

Для локализации соответствующего элемента устройства для текущей VC служит следующая функция:

sprintf(ttyname, "/dev/tty%d", get_current_vc(fd));

20.5. Управление переключением виртуальных консолей

Для того чтобы найти неиспользуемую VC (другими словами, консоль, на которую в данный момент не ссылается ни один открытый файловый дескриптор в процессах) и активизировать ее, используется команда управления вводом-выводом

VT_OPENQRY
.

retcode = ioctl(fd, VT_OPENQRY, &vtnum);

if ((retcode < 0) || (vtnum == -1)) {

 perror("myapp: нет доступных виртуальных терминалов");

 /* выполнить соответствующее действие */

}

Если в настоящее время используется менее 63 VC, и все из них заняты, то ядро автоматически выделяет память для новой VC [152] .

Для запуска переключения на другую VC (например, на ту свободную консоль, которую вы только что обнаружили) используется команда управления вводом-выводом

VT_ACTIVATE
. Если нужно подождать до тех пор, пока консоль не станет активной, применяется команда
VT_WAITACTIVE
. Смена консоли может занять некоторое время, возможно, несколько секунд. Это объясняется тем, что активизируемая консоль может находиться в графическом режиме, при этом содержимое экрана нужно реконструировать из памяти, выбрать из буфера обмена или восстановить каким-то другим способом, отнимающим немало времени [153] .

152

В большинстве остальных систем с виртуальными консолями или терминалами динамическое распределение для них не производится.

153

Отдельные системы (но не Linux) инициируют автоматическое переключение, если вызывается консоль, которая не исполняется в текущий момент.

ioctl(fd, VT_ACТIVATE, vtnum);

ioctl(fd, VT_WAITACTIVE, vtnum);

Для осуществления контроля над переключениями VC или для получения уведомлений о подобных переключениях необходимо предусмотреть надежные обработчики сигналов с

sigaction
, как обсуждалось в главе 12. Здесь мы применяем
SIGUSR1
и
SIGUSR2
; если нужно, вы можете использовать любые другие два сигнала, которые не предназначены для других целей (например,
SIGPROF
и
SIGURG
). Просто убедитесь, что выбранные вами сигналы удовлетворяют перечисленным ниже критериям.

Поделиться:
Популярные книги

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Кай из рода красных драконов

Бэд Кристиан
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Чапаев и пустота

Пелевин Виктор Олегович
Проза:
современная проза
8.39
рейтинг книги
Чапаев и пустота

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Лютая

Шёпот Светлана Богдановна
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Лютая

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Ученик

Губарев Алексей
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Ученик

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5