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

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

Жанры

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

Троан Эрик В.

Шрифт:

• Они не требуются остальным системным функциям, особенно это касается тех сигналов, которые не могут быть перехвачены или проигнорированы.

• Они нигде не используются в вашем приложении для других целей.

• Они не представляют один и тот же сигнальный номер с двумя различными именами, как

SIGPOLL
и
SIGIO
(определения смотрите в
/usr/include/asm/signal.h
, либо ограничьте себя использованием сигналов из табл. 12.1).

void relsig(int signo) {

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

}

void acqsig(int signo) {

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

}

void setup_signals(void) { struct sigaction sact;

 /* He маскировать никаких сигналов в то время,

* когда активизированы данные обработчики. */

 sigemptyset(&sact.sa_mask);

 /* Здесь может понадобиться добавление вызовов sigaddset,

* если существуют сигналы, которые нужно маскировать

* при переключении VC. */

 sact.flags = 0;

 sact.sa_handler = relsig;

 sigaction(SIGUSR1, &sact, NULL);

 sact.sa_handler = acqsig;

 sigaction(SIGUSR2, &sact, NULL);

}

После этого потребуется изменить стандартный режим VC (

mode
) с
VT_AUTO
на
VT_PROGRESS
, пока консоль уведомляется об обработчиках сигналов путем установки
relsig
и
acqsig
.

void control_vc_switching(int fd) {

 struct vt_mode vtmode;

 vtmode.mode = VT_PROCESS;

 vtmode.waitv = 1;

 vtmode.relsig = SIGUSR1;

 vtmode.acqsig = SIGUSR2;

 vtmode.frsig = 0;

 ioctl(fd, VT_SETMODE, &vtmode);

}

Обработчики сигналов, которые вызываются тогда, когда консоль находится в режиме

VT_PROCESS
, не должны соглашаться на переключение. Говоря более точно, обработчик
relsig
может отклонить разрешение на переключение VC. Обработчик
acqsig
, как правило, управляет процессом передачи консоли, но существует вероятность того, что он инициирует переключение на другую консоль. Будьте внимательны при кодировании обработчиков сигналов, чтобы избежать вызова любых нереентерабельных библиотечных функций. POSIX.1 устанавливает, что функции, перечисленные в табл. 12.2, являются реентерабельными. Значит, вы должны считать все остальные функции нереентерабельными, особенно, если хотите написать переносимую программу. Обратите внимание, в частности, на то, что
malloc
и
printf
являются нереентерабельными.

Ниже приведены примеры функций

relsig
и
acqsig
, выполняющих полезную работу. Особо следует отметить, что для функции
relsig
вызов
VT_RELDISP
является обязательным, тогда как для
acqsig
вызов
VT_RELDISP
рекомендуется только ради переносимости.

void relsig (int signo) {

 if (change_vc_ok) {

/*
Разрешено переключение VC */

save_state;

ioctl(fd, VT_RELDISP, 1);

 } else {

/* Запрещено переключение VC */

ioctl(fd, VT_RELDISP, 0);

 }

}

void acqsig (int signo) {

 restore_state;

 ioctl(fd, VT_RELDISP, VT_ACKACQ);

}

Теперь вы в состоянии реализовать код функций

change_vc_ok
,
save_state
и
restore_state
.

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

ioctl
.

ioctl(fd, VT_DISALLOCATE, vtnum);

Вы можете заблокировать и повторно открыть переключение VC с помощью нескольких простых команд управления вводом-выводом:

void disallow_vc_switch(int fd) {

 ioctl(fd, VT_LOCKSWITCH, 0);

}

void allow_vc_switch(int fd) {

 ioctl(fd, VT_UNLOCKSWITCH, 0);

}

20.6. Пример команды

open

Ниже показан пример кода, выполняющий следующие задачи: поиск неиспользуемой VC, запуск на ней оболочки, ожидание завершения оболочки, переключение обратно, а также освобождение памяти, выделенной под VC, по завершении программы. Программа

open
, входящая в состав дистрибутива Linux, выполняет те же самые действия, но при этом она содержит больше опций и лучший контроль ошибок, таким образом, является более надежной. Хотя приведенная ниже версия тоже будет работать, ее трудно назвать удобной, надежной или безопасной.

 1: /* minopen.c */

 2:

 3: #include <stdio.h>

 4: #include <unistd.h>

 5: #include <stdlib.h>

 6: #include <signal.h>

 7: #include <fcntl.h>

 8: #include <sys/ioctl.h>

 9: #include <sys/vt.h>

10: #include <sys/stat.h>

11: #include <sys/types.h>

12: #include <sys/wait.h>

13:

14: int main (int argc, const char ** argv) {

15: int vtnum;

16: int vtfd;

17: struct vt_stat vtstat;

18: char device[32];

19: int child;

20:

21: vtfd = open("/dev/tty", O_RDWR, 0);

22: if (vtfd < 0) {

23: perror("minopen: не удается открыть /dev/tty");

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

Газлайтер. Том 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