20.5. Управление переключением виртуальных консолей
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].
ioctl(fd, VT_ACТIVATE, vtnum);
ioctl(fd, VT_WAITACTIVE, vtnum);
Для осуществления контроля над переключениями VC или для получения уведомлений о подобных переключениях необходимо предусмотреть надежные обработчики сигналов с sigaction, как обсуждалось в главе 12. Здесь мы применяем SIGUSR1 и SIGUSR2; если нужно, вы можете использовать любые другие два сигнала, которые не предназначены для других целей (например, SIGPROF и SIGURG). Просто убедитесь, что выбранные вами сигналы удовлетворяют перечисленным ниже критериям.
• Они не требуются остальным системным функциям, особенно это касается тех сигналов, которые не могут быть перехвачены или проигнорированы.
• Они нигде не используются в вашем приложении для других целей.
• Они не представляют один и тот же сигнальный номер с двумя различными именами, как 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);
}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Виды виртуальных машин
Виды виртуальных машин Система виртуальных машин может быть построена на базе различных платформ и при помощи разных технологий. Используемая схема виртуализации зависит как от аппаратной платформы, так и от особенностей «взаимоотношений» хостовой ОС и поддерживаемых
Консоль виртуальных машин
Консоль виртуальных машин Большую часть окна консоли занимает поле, в котором отображается перечень имеющихся ВМ. Если ни одной машины еще не создано, то это поле пустое (см. рис. 2.4), а в правой части окна доступна единственная кнопка — New (создать). Эта кнопка запускает
Создание сети из виртуальных машин
Создание сети из виртуальных машин Вариант построения сети из виртуальных машин является наиболее простым. Чтобы получить такую сеть, достаточно выполнить три шага.1. При настройке каждой ВМ, включаемой в сеть, для используемого сетевого адаптера укажите вариант Local only
Окно виртуальных машин
Окно виртуальных машин Центральную часть окна виртуальных машин занимает поле, в котором отображаются значения основных параметров и текущая конфигурация запущенной ВМ (рис. 4.7). Рис. 4.7. Окно виртуальных машин Parallels WorkstationВ каждый момент времени могут быть представлены
Глава 20 Программирование виртуальных консолей
Глава 20 Программирование виртуальных консолей Интерфейс программирования виртуальных консолей Linux основан на интерфейсе, который предоставляют некоторые версии UNIX. Это не полная реализация (хотя ее достаточно для совместимости исходного кода почти со всеми
7.4. Создание виртуальных Web-серверов
7.4. Создание виртуальных Web-серверов На одном физическом сервере может работать большое количество виртуальных Web-серверов, например, www.your_name.com и www.your_company.com. Это два разных Web-сайта, но они находятся на одном сервере. Такое расположение дает нам следующие
10.4. Создание виртуальных серверов
10.4. Создание виртуальных серверов Поддержка виртуальных серверов для FTP — очень мощная вещь. Когда на компьютере крутится 20 виртуальных Web-серверов и ими управляют разные люди, то вполне логичным будет для каждого из них поставить в соответствие свой FTP-сервер. В этом
Организация виртуальных доменов
Организация виртуальных доменов Ранее в данной главе рассматривалось применение сервера Apache для работы с Web- страницами, принадлежащими одному Web-узлу. Возможно ли разместить на одном компьютере несколько Web-узлов? Положительный ответ на данный вопрос очевиден, так как
Использование виртуальных доменов
Использование виртуальных доменов Наличие виртуальных доменов позволяет Web-серверу по-разному обрабатывать запросы, в зависимости от имен, указанных в них. (Чтобы к Web-серверу можно было обращаться по разным именам, необходимо создать несколько записей в
Конфигурация виртуальных доменов
Конфигурация виртуальных доменов Существуют два способа организации работы с виртуальными доменами. Один из них состоит в том, что, в зависимости от имени, указанного в запросе, в качестве корневого каталога документов выбираются различные каталоги. Второй способ
Конфигурация стандартных консолей
Конфигурация стандартных консолей Консоль — это специальный файл для работы с консолью управления Microsoft (программа mmc.exe, о которой будет рассказано в главе 3 книги), имеющий расширение MSС и содержащий одну или несколько оснасток. Кроме пользовательских консолей, которые
Product placement в виртуальных городах
Product placement в виртуальных городах Говоря о нестандартных рекламных носителях, следует особо отметить такой способ продвижения, как product placement в виртуальных городах. Речь идет об интеграции брендов в виртуальную среду комьюнитиобразующих сайтов (в первую очередь
ТЕМА НОМЕРА: Игра по-крупному: Куда идет рынок консолей
ТЕМА НОМЕРА: Игра по-крупному: Куда идет рынок консолей Автор: Родион Насакин29 сентября Nintendo представляла в Москве свою приставку седьмого поколения Wii. Мировая аудитория геймеров ждала выхода консолей с качественно новым спектром функциональных и технологических
Маленькие игры, большие игроки: производителям Android-консолей уже тесно Евгений Золотов
Маленькие игры, большие игроки: производителям Android-консолей уже тесно Евгений Золотов Опубликовано 01 июля 2013 По состоянию на май 2013 года — меньше чем через пять лет после своего рождения — операционная система Android управляет почти одним