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);

}

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

ТЕМА НОМЕРА: Игра по-крупному: Куда идет рынок консолей

Из книги Журнал «Компьютерра» № 44 от 28 ноября 2006 года автора Журнал «Компьютерра»

ТЕМА НОМЕРА: Игра по-крупному: Куда идет рынок консолей Автор: Родион Насакин29 сентября Nintendo представляла в Москве свою приставку седьмого поколения Wii. Мировая аудитория геймеров ждала выхода консолей с качественно новым спектром функциональных и технологических


Product placement в виртуальных городах

Из книги Продвижение бизнеса в Интернет. Все о PR и рекламе в сети автора Гуров Филипп

Product placement в виртуальных городах Говоря о нестандартных рекламных носителях, следует особо отметить такой способ продвижения, как product placement в виртуальных городах. Речь идет об интеграции брендов в виртуальную среду комьюнитиобразующих сайтов (в первую очередь


Виды виртуальных машин

Из книги Виртуальные машины [Несколько компьютеров в одном] автора Гультяев Алексей Константинович

Виды виртуальных машин Система виртуальных машин может быть построена на базе различных платформ и при помощи разных технологий. Используемая схема виртуализации зависит как от аппаратной платформы, так и от особенностей «взаимоотношений» хостовой ОС и поддерживаемых


Консоль виртуальных машин

Из книги Сетевые средства Linux автора Смит Родерик В.

Консоль виртуальных машин Большую часть окна консоли занимает поле, в котором отображается перечень имеющихся ВМ. Если ни одной машины еще не создано, то это поле пустое (см. рис. 2.4), а в правой части окна доступна единственная кнопка — New (создать). Эта кнопка запускает


Создание сети из виртуальных машин

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

Создание сети из виртуальных машин Вариант построения сети из виртуальных машин является наиболее простым. Чтобы получить такую сеть, достаточно выполнить три шага.1. При настройке каждой ВМ, включаемой в сеть, для используемого сетевого адаптера укажите вариант Local only


Окно виртуальных машин

Из книги Цифровой журнал «Компьютерра» № 180 автора Журнал «Компьютерра»

Окно виртуальных машин Центральную часть окна виртуальных машин занимает поле, в котором отображаются значения основных параметров и текущая конфигурация запущенной ВМ (рис. 4.7). Рис. 4.7. Окно виртуальных машин Parallels WorkstationВ каждый момент времени могут быть представлены


Организация виртуальных доменов

Из книги Недокументированные и малоизвестные возможности Windows XP автора Клименко Роман Александрович

Организация виртуальных доменов Ранее в данной главе рассматривалось применение сервера Apache для работы с Web- страницами, принадлежащими одному Web-узлу. Возможно ли разместить на одном компьютере несколько Web-узлов? Положительный ответ на данный вопрос очевиден, так как


Использование виртуальных доменов

Из книги Linux глазами хакера автора Флёнов Михаил Евгеньевич

Использование виртуальных доменов Наличие виртуальных доменов позволяет Web-серверу по-разному обрабатывать запросы, в зависимости от имен, указанных в них. (Чтобы к Web-серверу можно было обращаться по разным именам, необходимо создать несколько записей в


Конфигурация виртуальных доменов

Из книги Взрыв обучения: Девять правил эффективного виртуального класса автора Мердок Мэттью

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


Глава 20 Программирование виртуальных консолей

Из книги автора

Глава 20 Программирование виртуальных консолей Интерфейс программирования виртуальных консолей Linux основан на интерфейсе, который предоставляют некоторые версии UNIX. Это не полная реализация (хотя ее достаточно для совместимости исходного кода почти со всеми


Маленькие игры, большие игроки: производителям Android-консолей уже тесно Евгений Золотов

Из книги автора

Маленькие игры, большие игроки: производителям Android-консолей уже тесно Евгений Золотов Опубликовано 01 июля 2013 По состоянию на май 2013 года — меньше чем через пять лет после своего рождения — операционная система Android управляет почти одним


Конфигурация стандартных консолей

Из книги автора

Конфигурация стандартных консолей Консоль — это специальный файл для работы с консолью управления Microsoft (программа mmc.exe, о которой будет рассказано в главе 3 книги), имеющий расширение MSС и содержащий одну или несколько оснасток. Кроме пользовательских консолей, которые


7.4. Создание виртуальных Web-серверов

Из книги автора

7.4. Создание виртуальных Web-серверов На одном физическом сервере может работать большое количество виртуальных Web-серверов, например, www.your_name.com и www.your_company.com. Это два разных Web-сайта, но они находятся на одном сервере. Такое расположение дает нам следующие


10.4. Создание виртуальных серверов

Из книги автора

10.4. Создание виртуальных серверов Поддержка виртуальных серверов для FTP — очень мощная вещь. Когда на компьютере крутится 20 виртуальных Web-серверов и ими управляют разные люди, то вполне логичным будет для каждого из них поставить в соответствие свой FTP-сервер. В этом