IOCTL_CONSOLE(2)

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

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

KDGETLED
    Получить состояние индикаторов. argp указывает ячейку типа char. В младших трёх битах *argp хранится состояние индикаторов:
    LED_CAP | 0x04 | индикатор caps lock
    LED_NUM | 0x02 | индикатор num lock
    LED_SCR | 0x01 | индикатор scroll lock

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

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

KDGKBLED
    Получить флаги клавиатуры: CapsLock, NumLock, ScrollLock (не индикаторы). argp указывает на ячейку типа char, в которой сохраняется состояния флагов. Младшие три бита (маска 0x7) содержат текущее состояние флагов, следующие три бита (маска 0x70) содержат устанавливаемое состояние флагам по умолчанию (начиная с Linux 1.1.54).

KDSKBLED
    Установить флаги клавиатуры: CapsLock, NumLock, ScrollLock (не индикаторы). Беззнаковое длинное целое argp содержит требуемые состояния флагов. Три младших бита (маска 0x7) содержат состояния флагов, следующие три бита (маска 0x70) содержат состояния флагов по умолчанию (начиная с Linux 1.1.54).

KDGKBTYPE
    Получить тип клавиатуры. Возвращается значение KB_101 равное 0x02.

KDADDIO
    Добавить порт ввода/вывода (I/O) как допустимый. Эквивалентно вызову ioperm(arg,1,1).

KDDELIO
    Удалить порт ввода/вывода (I/O) как недопустимый. Эквивалентно вызову ioperm(arg,1,0).

KDENABIO
    Включить ввод/вывод на видеокарту. Эквивалентно вызову ioperm(0x3b4, 0x3df-0x3b4+1, 1).

KDDISABIO
    Выключить ввод/вывод на видеокарту. Эквивалентно вызову ioperm(0x3b4, 0x3df-0x3b4+1, 0).

KDSETMODE
    Установить текстовый/графический режим. Беззнаковое целое argp содержит одно из двух значений:
    KD_TEXT | 0x00
    KD_GRAPHICS | 0x01

KDGETMODE
    Получить тип режима (текстовый/графический). Значение argp указывает на int, равное одному из представленных чуть ранее в KDSETMODE.

KDMKTONE
    Генерировать тон заданной длительности. Младшие 16 битов беззнакового длинного целого argp задают частоту тона (период в тактах), старшие 16 битов устанавливают его длительность в мсек. Если длительность равна нулю, звук выключается. Управление возвращается немедленно. Например, argp = (125<<16) + 0x637 определяет звук, обычно связанный с ctrl-G (работает начиная с Linux 0.99pl1; не работает в Linux 2.1.49-50).

KIOCSOUND
    Запустить и остановить генерацию звука. Младшие 16 битов argp определяют период в тактах (то есть argp = 1193180/частота). Значение argp = 0 выключает звук. В обоих случаях управление возвращается немедленно.

GIO_CMAP
    Получить из ядра текущую цветовую карту по умолчанию. argp указывает на массив из 48 байтов (начиная с Linux 1.3.3).

PIO_CMAP
    Изменить цветовую карту по умолчанию для текстового режима. argp указывает на массив из 48 байтов, который содержит, по порядку, значения красного, зеленого и синего для 16-и доступных экранных цветов: 0 — составляющая выключена, 255 — полная интенсивность. Цвета по умолчанию, по порядку: чёрный, тёмно-красный, тёмно-зелёный, коричневый, тёмно-синий, тёмно-сиреневый, тёмно-голубой, светло-серый, тёмно-серый, ярко-красный, ярко-зелёный, жёлтый, ярко-синий, ярко-сиреневый, ярко-голубой и белый (начиная с Linux 1.3.3).

GIO_FONT
    Получить экранный шрифт (256 символов) в расширенном виде. argp указывает на массив из 8192 байтов. Возвращает код ошибки EINVAL, если текущий загруженный шрифт содержит 512 символов или консоль находится не в текстовом режиме.

GIO_FONTX
    Получить экранный шрифт и связанную с ним информацию. argp указывает на struct consolefontdesc (см. PIO_FONTX). При вызове значение поля charcount должно быть равно максимальному числу символов, которое помещается в буфер, указываемый chardata. При возврате charcount и charheight содержат информацию о текущем загруженном шрифте, а массив chardata содержит данные шрифта, если согласно начальному значению charcount для этого достаточно места; в противном случае буфер остаётся неизменным и errno присваивается значение ENOMEM (начиная с Linux 1.3.1).

PIO_FONT
    Установить экранный шрифт из 256 символов. Шрифт загружается в знакогенератор EGA/VGA. argp указывает на карту размером 8192 байта (32 байта на символ). Только первые N из них используются для шрифта 8xN (0 < N <= 32). Этот вызов также отменяет перекодировку в Юникод.

PIO_FONTX
    Установить экранный шрифт и соответствующую информацию для изображения. argp указывает на структуру:

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

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

PIO_FONTRESET
    Сбросить экранный шрифт, размер и перекодировку в Юникод в начальные значения, использованные при загрузке. Аргумент argp не используется, но его значение должно быть NULL, чтобы эта версия была совместима с будущими версиями Linux. (Начиная с Linux 1.3.28).

GIO_SCRNMAP
    Получить разметку экрана из ядра. argp указывает на область размером E_TABSZ, которая заполняется позициями символов шрифта, используемыми при отображении. Вызов возвращает бесполезную информацию, если текущий загруженный шрифт содержит более 256 символов.

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

PIO_SCRNMAP
    Загрузить «определяемую пользователем» (четвёртую) таблицу в ядро, по которой перекодируются байты в символы экрана консоли. argp указывает на область размером E_TABSZ.

PIO_UNISCRNMAP
    Загрузить «определяемую пользователем» (четвёртую) таблицу в ядро, перекодирующую байты в значения Юникода, которые затем транслируются в экранные символы согласно текущей загруженной карте соответствия символов Юникода и шрифта. Специальные коды Юникода, начинающиеся с U+F000, могут использоваться для непосредственного перевода байтов в символы шрифта (начиная с Linux 1.3.1).

GIO_UNIMAP
    Получить соответствие символов Юникода шрифту из ядра. argp указывает на структуру

        struct unimapdesc {
            unsigned short  entry_ct;
            struct unipair *entries;
        };

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

        struct unipair {
            unsigned short unicode;
            unsigned short fontpos;
        };

    (начиная с Linux 1.1.92)

PIO_UNIMAP
    Поместить соответствие символов Юникода и экранного шрифта в ядро. argp указывает на struct unimapdesc (начиная с Linux 1.1.92).

PIO_UNIMAPCLR
    Очистить таблицу, возможно с помощью алгоритма хэширования. argp указывает на структуру

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

    (начиная с Linux 1.1.92)

KDGKBMODE
    Получить текущий режим клавиатуры. Значение argp указывает на ячейку типа long, в которой может быть одно из значений:
    K_RAW | 0x00 /* режим без обработки (скан-коды) */
    K_XLATE | 0x01 /* транслированные с помощью keymap коды клавиш */
    K_MEDIUMRAW | 0x02 /* режим средней обработки (скан-коды) */
    K_UNICODE | 0x03 /* режим Юникода */
    K_OFF | 0x04 /* режим выключен; начиная с Linux 2.6.39 */

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

KDGKBMETA
    Получить режим обработки метаклавиш. argp указывает на ячейку типа long, в которой может быть одно из значений:
    K_METABIT | 0x03 | установлен старший бит
    K_ESCPREFIX | 0x04 | экранирующий префикс

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

KDGKBENT
    Получить один элемент из таблицы трансляции клавиш (код клавиши для кода действия). 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 неверно.

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

KDGKBSENT
    Получить значение строки функциональной клавиши. argp указывает на структуру

        struct kbsentry {
            unsigned char kb_func;
            unsigned char kb_string[512];
        };

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

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

KDGKBDIACR
    Получить таблицу акцентов из ядра. argp указывает на структуру

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

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

        struct kbdiacr {
            unsigned char diacr;
            unsigned char base;
            unsigned char result;
        };

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

        struct kbkeycode {
            unsigned int scancode;
            unsigned int keycode;
        };

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

KDSETKEYCODE
    Записать элемент таблицы кодов клавиш ядра. argp указывает на struct kbkeycode (начиная с Linux 1.1.63).

KDSIGACCEPT
    Вызывающий процесс показывает свою готовность к приёму сигнала argp, если он генерируется нажатием соответствующей комбинации клавиш (1 <= argp <= NSIG). Смотрите функцию spawn_console() в linux/drivers/char/keyboard.c.

VT_OPENQRY
    Получить первую доступную (не открытую) консоль. argp указывает ячейку типа int, устанавливаемое значение которой равно номеру vt (1 <= *argp <= MAX_NR_CONSOLES).

VT_GETMODE
    Считывает режим активного 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_SETMODE
    Установить режим активного vt. argp указывает на struct vt_mode.

VT_GETSTATE
    Получить общую информацию о состоянии 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).

VT_RELDISP
    Освободить дисплей.

VT_ACTIVATE
    Переключиться на виртуальный терминал argp (1 <= argp <= MAX_NR_CONSOLES).

VT_WAITACTIVE
    Подождать, пока виртуальный терминал argp не станет активным.

VT_DISALLOCATE
    Освободить память, выделенную виртуальному терминалу argp (начиная с Linux 1.1.54).

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

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

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

VT_RESIZEX
    Установить значение различных параметров экрана в ядре. 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) (начиная с Linux 1.3.3).

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

TIOCLINUX, subcode=0
    Сделать дамп экрана. Удалено в Linux 1.1.92 (c ядром 1.1.92 и более поздним используйте чтение из /dev/vcsN или /dev/vcsaN).

TIOCLINUX, subcode=1
    Получить информацию о задании. Удалено в Linux 1.1.92.

TIOCLINUX, subcode=2
    Произвести выделение. Значение 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.

TIOCLINUX, subcode=3
    Вставить выделение. Символы буфера выделения записываются в fd.

TIOCLINUX, subcode=4
    Убрать заставку (blank screen)

TIOCLINUX, subcode=5
    Установить содержимое 256-битной таблицы поиска определения символов в «word» для выделения «слово за словом» (начиная с Linux 1.1.32).

TIOCLINUX, subcode=6
    Значение argp указывает ячейку типа char, которая устанавливает значение переменной ядра shift_state (начиная с Linux 1.1.32).

TIOCLINUX, subcode=7
    Значение argp указывает ячейку типа char, которая устанавливает значение переменной ядра report_mouse (начиная с Linux 1.1.33).

TIOCLINUX, subcode=8
    Сделать дамп значений ширины и высоты экрана, позиции курсора и всех пар символ-атрибут (только в версиях с 1.1.67 по 1.1.91. С ядром 1.1.92 и более поздних версий используйте чтение /dev/vcsa*).

TIOCLINUX, subcode=9
    Восстановить ширину и высоту экрана, позицию курсора и все пары символ-атрибут (только в версиях с 1.1.67 по 1.1.91. С ядром 1.1.92 и более поздних версий используйте запись в /dev/vcsa*).

TIOCLINUX, subcode=10
    Обработчик функций энергосбережения для нового поколения мониторов. Режим гашения (blanking) экрана VESA устанавливается равным argp[1], который определяет тип гашения:

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

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

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

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

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

EBADF
    Неправильный файловый дескриптор.

EINVAL
    Неправильный файловый дескриптор или argp.

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

EPERM
    Недостаточно прав.

ЗАМЕЧАНИЯ
Предупреждение: не рассматривайте эту справочную страницу как документацию о 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), ioctl_tty(2), ioperm(2), termios(3), console_codes(4), mt(4), sd(4), tty(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