Scroll to navigation

CONSOLE_IOCTL(4) Руководство программиста Linux CONSOLE_IOCTL(4)

ИМЯ

console_ioctl - управление вводом-выводом (ioctl) консольного терминала и виртуальных консолей

ОПИСАНИЕ

Поддерживаются Linux-ориентированные запросы ioctl(2), перечисленные далее. Для каждого запроса требуется третий аргумент, который далее именуется argp.

Получить состояние индикаторов. argp указывает ячейку типа char. В младших трёх битах *argp хранится состояние индикаторов:


LED_CAP 0x04 индикатор caps lock
LEC_NUM 0x02 индикатор num lock
LED_SCR 0x01 индикатор scroll lock

Установить состояние индикаторов. Состояние индикаторов устанавливается в соответствии с тремя младшими битами argp. Однако, если установлен старший бит, индикаторы возвращаются в исходное состояние: отображают состояние функций клавиатуры caps lock, num lock и scroll lock.

До появления ядра 1.1.54 индикаторы состояния отражали только состояние флагов клавиатуры, которые также могли быть изменены KDGETLED/KDSETLED. После появления 1.1.54 они могли отображать уже произвольную информацию, но по умолчанию показывали флаги клавиатуры. Последующие две команды ioctl используются для доступа к флагам клавиатуры.

Получить флаги клавиатуры: CapsLock, NumLock, ScrollLock (не индикаторы). argp указывает на ячейку типа char, в которой сохраняется состояния флагов. Младшие три бита (маска 0x7) содержат текущее состояние флагов, следующие три бита (маска 0x70) содержат устанавливаемое состояние флагам по умолчанию. (Начиная с ядра 1.1.54).
Установить флаги клавиатуры: CapsLock, NumLock, ScrollLock (не индикаторы). argp содержит требуемые состояния флагов. Три младших бита (маска 0x7) содержат состояния флагов, следующие три бита (маска 0x70) содержат состояния флагов по умолчанию. (Начиная с 1.1.54).
Получить тип клавиатуры. Возвращается значение KB_101 равное 0x02.
Добавить порт ввода/вывода (I/O) как допустимый. Эквивалентно вызову ioperm(arg,1,1).
Удалить порт ввода/вывода (I/O) как недопустимый. Эквивалентно вызову ioperm(arg,1,0).
Включить ввод/вывод на видеокарту. Эквивалентно вызову ioperm(0x3b4, 0x3df-0x3b4+1, 1).
Выключить ввод/вывод на видеокарту. Эквивалентно вызову ioperm(0x3b4, 0x3df-0x3b4+1, 0).
Установить текстовый/графический режим. argp содержит одно из двух значений:


KD_TEXT 0x00
KD_GRAPHICS 0x01

Получить тип режима (текстовый/графический). argp указывает на ячейку типа long, которой присваивается одно из вышеперечисленных устанавливаемых значений.
Генерировать тон заданной длительности. Младшие 16 битов argp задают частоту тона (период в тактах), старшие 16 битов устанавливают его длительность в мсек. Если длительность равна нулю, звук выключается. Управление возвращается немедленно. Например, argp = (125<<16) + 0x637 определяет звук, обычно связанный с ctrl-G. (Работает начиная с 0.99pl1; не работает в 2.1.49-50).
Запустить и остановить генерацию звука. Младшие 16 битов argp определяют период в тактах (то есть argp = 1193180/частота). Значение argp = 0 выключает звук. В обоих случаях управление возвращается немедленно.
Получить из ядра текущую цветовую карту по умолчанию. argp указывает на массив из 48 байтов. (Начиная с 1.3.3.)
Изменить цветовую карту по умолчанию для текстового режима. argp указывает на массив из 48 байтов, который содержит, по порядку, значения красного, зеленого и синего для 16-и доступных экранных цветов: 0 — составляющая выключена, 255 — полная интенсивность. Цвета по умолчанию, по порядку: чёрный, тёмно-красный, тёмно-зелёный, коричневый, тёмно-синий, тёмно-сиреневый, тёмно-голубой, светло-сервый, тёмно-серый, ярко-красный, ярко-зелёный, жёлтый, ярко-синий, ярко-сиреневый, ярко-голубой и белый. (Начиная с 1.3.3).
Получить экранный шрифт (256 символов) в расширенном виде. argp указывает на массив из 8192 байтов. Возвращает код ошибки EINVAL, если текущий загруженный шрифт содержит 512 символов или консоль находится не в текстовом режиме.
Получить экранный шрифт и связанную с ним информацию. argp указывает на struct consolefontdesc (см. PIO_FONTX). При вызове значение поля charcount должно быть равно максимальному числу символов, которое помещается в буфер, указываемый chardata. При возврате charcount и charheight содержат информацию о текущем загруженном шрифте, а массив chardata содержит данные шрифта, если согласно начальному значению charcount для этого достаточно места; в противном случае буфер остаётся неизменным и errno присваивается значение ENOMEM. (Начиная с 1.3.1).
Установить экранный шрифт из 256 символов. Шрифт загружается в знакогенератор EGA/VGA. argp указывает на карту размером 8192 байта (32 байта на символ). Только первые N из них используются для шрифта 8xN (0 < N <= 32). Этот вызов также отменяет перекодировку в Юникод.
Установить экранный шрифт и соответствующую информацию для изображения. argp указывает на структуру:


struct consolefontdesc {

unsigned short charcount; /* число символов в шрифте
(256 или 512) */
unsigned short charheight; /* число линий сканирования на
символ (1-32) */
char *chardata; /* данные шрифта в
расширенном формате */ };

Если требуется, соответственно изменяются размеры экрана и соответствующим процессам посылается сигнал SIGWINCH. Этот вызов также отменяет перекодировку в Юникод. (Начиная с 1.3.1).

Сбросить экранный шрифт, размер и перекодировку в Юникод в начальные значения, использованные при загрузке. Аргумент argp не используется, но его значение должно быть NULL, чтобы эта версия была совместима с будущими версиями Linux. (Начиная с 1.3.28).
Получить разметку экрана из ядра. argp указывает на область размером E_TABSZ, которая заполняется позициями символов шрифта, используемыми при отображении. Вызов возвращает бесполезную информацию, если текущий загруженный шрифт содержит более 256 символов.
Получить полную экранную перекодировку в Юникод из ядра. argp указывает на область размером E_TABSZ*sizeof(unsigned short), которая заполняется представлением в Юникоде каждого символа. Специальный набор Юникода, начинающийся с U+F000, используется для перекодировки "напрямую в шрифт". (Начиная с 1.3.1).
Загрузить "определяемую пользователем" (четвёртую) таблицу в ядро, по которой перекодируются байты в символы экрана консоли. argp указывает на область размером E_TABSZ.
Загрузить "определяемую пользователем" (четвёртую) таблицу в ядро, перекодирующую байты в значения Юникода, которые затем транслируются в экранные символы согласно текущей загруженной карте соответствия символов Юникода и шрифта. Специальные коды Юникода, начинающиеся с U+F000, могут использоваться для непосредственного перевода байтов в символы шрифта. (Начиная с 1.3.1).
Получить соответствие символов Юникода шрифту из ядра. argp указывает на структуру


struct unimapdesc {

unsigned short entry_ct;
struct unipair *entries; };

где entries указывает на массив структур


struct unipair {

unsigned short unicode;
unsigned short fontpos; };

(Начиная с 1.1.92.)

Поместить соответствие символов Юникода и экранного шрифта в ядро. argp указывает на struct unimapdesc. (Начиная с 1.1.92).
Очистить таблицу, возможно с помощью алгоритма хэширования. argp указывает на структуру


struct unimapinit {

unsigned short advised_hashsize; /* 0, если не использовать */
unsigned short advised_hashstep; /* 0, если не использовать */
unsigned short advised_hashlevel; /* 0, если не использовать */ };

(Начиная с 1.1.92.)

Получить текущий режим клавиатуры. argp указывает на ячейку типа long, в которой может быть одно из значений:


K_RAW 0x00
K_XLATE 0x01
K_MEDIUMRAW 0x02
K_UNICODE 0x03

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


K_METABIT 0x03 установлен старший бит
K_ESCPREFIX 0x04 экранирующий префикс

Установить режим обработки метаклавиш. argp указывает на ячейку типа long, значением которой может быть любое из представленных чуть ранее.
Получить один элемент из таблицы трансляции клавиш (код клавиши для кода действия). argp указывает на структуру


struct kbentry {

unsigned char kb_table;
unsigned char kb_index;
unsigned short kb_value; };

значения двух первых полей представляют собой: kb_table — выбранную таблицу клавиш (0 <= kb_table < MAX_NR_KEYMAPS) и kb_index — код клавиши (0 <= kb_index < NR_KEYS). kb_value присваивается соответствующий код действия или K_HOLE, если нет такой клавиши, или K_NOSUCHMAP, если значение kb_table неверно.

Создать элемент в таблице трансляции клавиш. argp указывает на struct kbentry.
Получить значение строки функциональной клавиши. argp указывает на структуру


struct kbsentry {

unsigned char kb_func;
unsigned char kb_string[512]; };

kb_string равна (заканчивающейся null) строке, соответствующей коду действия функциональной клавиши kb_func.

Создать элемент строки функциональной клавиши. argp указывает на struct kbsentry.
Получить таблицу акцентов из ядра. argp указывает на структуру


struct kbdiacrs {

unsigned int kb_cnt;
struct kbdiacr kbdiacr[256]; };

где kb_cnt — число элементов массива, каждый из которых является структурой


struct kbdiacr {

unsigned char diacr;
unsigned char base;
unsigned char result; };

Получить элемент таблицы кодов клавиш ядра (сканкод в код клавиши). argp указывает на структуру


struct kbkeycode {

unsigned int scancode;
unsigned int keycode; };

keycode устанавливается в соответствии с заданным scancode. (Допускается 89 <= scancode <= 255. Для 1 <= scancode <= 88, keycode==scancode.) (Начиная с 1.1.63.)

Записать элемент таблицы кодов клавиш ядра. argp указывает на struct kbkeycode. (Начиная с 1.1.63).
Вызывающий процесс показывает свою готовность к приему сигнала argp, если он генерируется нажатием соответствующей комбинации клавиш. (1 <= argp <= NSIG). (См. функцию spawn_console() в linux/drivers/char/keyboard.c).
Получить первую доступную (не открытую) консоль. argp указывает ячейку типа int, устанавливаемое значение которой равно номеру vt (1 <= *argp <= MAX_NR_CONSOLES).
Считывает режим активного vt. argp указывает на структуру


struct vt_mode {

char mode; /* режим vt */
char waitv; /* при установленном; остановка при записи, если терминал неактивен */
short relsig; /* послать сигнал при освобождении req */
short acqsig; /* послать сигнал при захвате */
short frsig; /* не используется (устанавливается в 0) */ };

которая задаёт режим активного vt. mode имеет одно из значений:


VT_AUTO автоматическое переключение vt
VT_PROCESS обрабатывать управление переключением
VT_ACKACQ подтверждающий переключатель

Установить режим активного vt. argp указывает на struct vt_mode.
Получить общую информацию о состоянии vt. argp указывает на структуру


struct vt_stat {

unsigned short v_active; /* активный vt */
unsigned short v_signal; /* посылаемый сигнал */
unsigned short v_state; /* битовая маска vt */ };

Для каждого используемого vt устанавливается соответствующий бит в поле v_state. (В версиях с 1.0 до 1.1.92).

Освободить дисплей.
Переключиться на виртуальный терминал argp (1 <= argp <= MAX_NR_CONSOLES).
Подождать, пока виртуальный терминал argp не станет активным.
Освободить память, выделенную виртуальному терминалу argp. (Начиная с 1.1.54.)
Установить представление о размере экрана в ядре. argp указывает на структуру


struct vt_sizes {

unsigned short v_rows; /* количество строк */
unsigned short v_cols; /* количество столбцов */
unsigned short v_scrollsize; /* не используется */ };

Заметим, что этот вызов не изменяет видеорежим. Смотрите resizecons(8). (Начиная с 1.1.54.)

Установить значение различных параметров экрана в ядре. argp указывает на структуру


struct vt_consize {

unsigned short v_rows; /* количество строк */
unsigned short v_cols; /* количество столбцов */
unsigned short v_vlin; /* количество строк на экране
в пикселях */
unsigned short v_clin; /* количество строк в символе
в пикселях */
unsigned short v_vcol; /* количество столбцов на экране
в пикселях */
unsigned short v_ccol; /* количество столбцов в символе
в пикселях */ };

Любому параметру может быть присвоено нулевое значение, указывающее "оставить без изменений", но, если задано несколько параметров, то они должны быть согласованы. Этот вызов не изменяет видеорежим. Смотрите resizecons(8). (Начиная с 1.3.3).

Действие следующих ioctl зависит от первого байта структуры, указываемой argp, далее называемой subcode. Доступны только суперпользователю или владельцу текущего tty.

Сделать дамп экрана. Удалено в 1.1.92. (С ядром 1.1.92 и более поздним используйте чтение из /dev/vcsN или /dev/vcsaN).
Получить информацию о задании. Удалено в 1.1.92.
Произвести выделение. argp указывает на структуру
struct {

char subcode;
short xs, ys, xe, ye;
short sel_mode; };

xs и ys — начальные столбец и строка. xe и ye — конечные столбец и строка. (У левого верхнего угла строка=столбец=1.) Значение sel_mode равно 0 для выделения "символ за символом", 1 для выделения "слово за словом" или 2 для выделения "строки за строкой". Выделенные символы подсвечиваются и сохраняются в статическом массиве sel_buffer из devices/char/console.c.
Вставить выделение. Символы буфера выделения записываются в fd.
Включить погашенный ранее (blank) экран.
Установить содержимое 256-битной таблицы поиска определения символов в "word" для выделения "слово за словом". (Начиная с 1.1.32).
argp указывает ячейку типа char, которая устанавливает значение переменной ядра shift_state. (Начиная 1.1.32.)
argp указывает ячейку типа char, которая устанавливает значение переменной ядра report_mouse. (Начиная с 1.1.33.)
Сделать дамп значений ширины и высоты экрана, позиции курсора и всех пар символ-атрибут. (Только в версиях с 1.1.67 по 1.1.91. С ядром 1.1.92 и более поздних версий используйте чтение из /dev/vcsa*).
Восстановить ширину и высоту экрана, позицию курсора и все пары символ-атрибут. (Только в версиях с 1.1.67 по 1.1.91. С ядром 1.1.92 и более поздних версий используйте запись в /dev/vcsa*).
Обработчик функций энергосбережения для нового поколения мониторов. Режим гашения (blanking) экрана VESA устанавливается равным argp[1], который определяет тип гашения:


0: гашение экрана выключено.


1: текущие установки регистров видеоадаптера сохраняются, когда контроллер программируется на отключение вертикальной синхронизации. Происходит перевод монитора в режим "ожидания" (standby). Если в мониторе есть таймер Off_Mode, то он может в итоге сам выключить питание.


2: текущие настройки сохраняются, а затем вертикальная и горизонтальная синхронизации отключаются. Происходит перевод в режим "выключен" (off). Если в мониторе нет таймера Off_Mode или вы хотите отключить питание сразу же по истечении времени blank_timer, то можете выбрать это значение. (Внимание: частое выключение питания может повредить монитор.)

(Начиная с 1.1.76.)

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

Переменная errno может принимать следующие значения:

Неправильный файловый дескриптор.
Файловый дескриптор не связан со специальным символьным устройством, или указанный запрос к нему неприменим.
Неправильный файловый дескриптор или argp.
Недостаточно прав.

ЗАМЕЧАНИЯ

Предупреждение: не рассматривайте эту справочную страницу как документацию о ioctl консоли Linux. Она предназначена только для любознательных, как альтернатива исходному коду. Ioctl — это внутренние недокументированные возможности Linux, которые могут изменяться без предупреждения. (И на самом деле, эта страница более или менее полно описывает параметры ядра версии 1.1.94; они несколько отличаются от параметров ядра более ранних версий.)

Очень часто ioctl вводятся для обмена между ядром и какой-то определённой известной программой (fdisk, hdparm, setserial, tunelp, loadkeys, selection, setfont и т.д.), и их поведение изменяется по требованию этой программы.

Программы, использующие такие ioctl, не могут быть перенесены в другие версии UNIX, не будут работать в старых версиях Linux и могут не работать в будущих версия Linux.

Используйте функции POSIX.

СМОТРИТЕ ТАКЖЕ

dumpkeys(1), kbd_mode(1), loadkeys(1), mknod(1), setleds(1), setmetamode(1), execve(2), fcntl(2), ioperm(2), termios(3), console(4), console_codes(4), mt(4), sd(4), tty(4), tty_ioctl(4), ttyS(4), vcs(4), vcsa(4), charsets(7), mapscrn(8), resizecons(8), setfont(8), /usr/include/linux/kd.h, /usr/include/linux/vt.h

2009-02-28 Linux