Вызов
ioctl()
для терминалов и последовательных портов воспринимает много разных
параметров команд. Большинство из них требуют при этом третий аргумент,
разных типаов, далее по тексту называемый argp или arg.
Вызовы
ioctl
используются только в непортируемых программах. По возможности старайтесь
везде использовать интерфейс POSIX, описанный в
termios(3).
Определение и установка атрибутов терминала
TCGETSstruct termios *argp
Эквивалентно tcgetattr(fd, argp).
Определяет текущие настройки последовательного порта.
TCSETSconst struct termios *argp
Эквивалентно tcsetattr(fd, TCSANOW, argp).
Устанавливает новые текущие настройки последовательного порта.
TCSETSWconst struct termios *argp
Эквивалентно tcsetattr(fd, TCSADRAIN, argp).
Позволяет очистить буфер вывода и установить новые
текущие настройки последовательного порта.
TCSETSFconst struct termios *argp
Эквивалентно tcsetattr(fd, TCSAFLUSH, argp).
Позволяет очистить буфер вывода, отменить ожидаемые данные на входе
и установить новые текущие настройки последовательного порта.
Следующие четыре вызова ioctl аналогичны TCGETS, TCSETS, TCSETSW, TCSETSF,
за исключением того, что они работают с
struct termio *
вместо
struct termios *.
TCGETAstruct termio *argp
TCSETAconst struct termio *argp
TCSETAWconst struct termio *argp
TCSETAFconst struct termio *argp
Блокировка и структура termios
Структура termios для tty может быть заблокирована. Блокировка сама по себе
является структурой termios, но с ненулевыми битами или полями, обозначающими
заблокированные значения.
TIOCGLCKTRMIOSstruct termios *argp
Определяет статус блокировки структуры termios терминала.
TIOCSLCKTRMIOSconst struct termios *argp
Устанавливает статус блокировки структуры termios терминала.
Это может делать только суперпользователь root.
Определение и установка размера окна
Размеры окон хранятся в ядре, но не используются им
(за исключением случаев виртуальных консолей, где ядро
обновляет размер окна при его изменении, например
из-за загрузки новых шрифтов).
TIOCGWINSZstruct winsize *argp
Определить размер окна.
TIOCSWINSZconst struct winsize *argp
Установить размер окна.
Структура используемая этими системными вызовами ioctl, определяется так:
struct winsize {
unsigned short ws_row;
unsigned short ws_col;
unsigned short ws_xpixel; /* unused */
unsigned short ws_ypixel; /* unused */
};
При изменении размера окна отправляется сигнал SIGWINCH
в группу фоновых процессов.
Отправление разрыва
TCSBRKint arg
Эквивалентно tcsendbreak(fd, arg).
Если терминал использует асинхронную передачу данных, и
arg
равно нулю, то отправляется сигнал разрыва (поток нулевых битов)
в течении 0.25 - 0.5 секунд. Если терминал не использует
асинхронную передачу данных, то либо сигнал разрыва не отправляется,
либо фукнция просто завершает работу, ничего не исполняя.
Если
arg
не равно нулю, то неизвестно, что произойдет.
(SVR4, UnixWare, Solaris, Linux воспринимает
tcsendbreak(fd,arg)
с ненулевым значением
arg
аналогично вызову
tcdrain(fd).
SunOS воспринимает
arg
как множитель и отправляет потом битов в
arg
раз дольше, чем для нулевого значения
arg.
DG-UX и AIX воспринимают
arg
(если оно не равно нулю) как временной интервал в миллисекундах.
HP-UX игнорирует
arg.)
TCSBRKPint arg
Так называемая "версия POSIX" TCSBRK. Она воспринимает ненулевые значения arg
как временной интервал в децисекундах, и ничего не делает, если
драйвер не поддерживает сигналы разрыва.
TIOCSBRKvoid
Включает сигнал разрыва, а именно - начинает отправлять нулевые биты.
TIOCCBRKvoid
Выключает сигнал разрыва, а именно - прекращает отправлять нулевые биты.
Перенаправляет вывод, который должен идти на /dev/console
или на
/dev/tty0
для указанного терминала tty. Если это был основной pty, то отправлять
его к подчиненному. Кто угодно может делать это, пока вывод не был
еще ни разу перенаправлен. Если он уже был перенаправлен, то
возвратится EBUSY, но root может остановить перенаправление,
используя этот вызов ioctl, с
fd,
указывающем на
/dev/console
или на
/dev/tty0.
Управление tty
TIOCSCTTYint arg
Определяет заданный tty как управляющий tty текущего процесса.
Текущий процесс должен быть основной сессией и не иметь ни одного
управляющего терминала. Если этот tty уже является управляющим tty
другой группы сессий, то ioctl завершается с ошибкой EPERM,
если только его не вызывает root и
arg
не равно 1 - в этом случае tty отбирается и сбрасывается во всех
процессах, где он был указан как управляющий tty.
TIOCNOTTYvoid
Если заданный tty был управляющим tty текущего процесса,
то отказаться от этого управляющего tty. Если процесс был
основной сессией, то фоновой группе процессоа отправляются
SIGHUP и SIGCONT и все процессы в этой сесии теряют
управляющий tty.
Группа процессов и идентификатор сессии
TIOCGPGRPpid_t *argp
Если успешно, то эквивалентно *argp = tcgetpgrp(fd).
Определяет идентификатор группы фоновой группы процессов данного tty.
TIOCSPGRPconst pid_t *argp
Эквивалентно tcsetpgrp(fd, *argp).
Устанавливает идентификатор фоновой группы процессов данного tty.
TIOCGSIDpid_t *argp
Определяет идентификатор сесии данного tty. Завершается с ошибкой ENOTTY
в случае, если tty не является основным pty и не наш управляющий tty.
Странно, однако.
Закрытый режим
TIOCEXCLvoid
помещает tty в закрытый режим.
Дальнейшие операции
open(2)
на терминале разрешены.
(Они будут выдавать ошибку EBUSY, за исключением root.)
TIOCNXCLvoid
Отменяет закрытый режим.
Параметры линии
TIOCGETDint *argp
Определяет параметры линии для tty.
TIOCSETDconst int *argp
Устанавливае параметры линии для tty.
Вызовы ioctl для псевдо-tty
TIOCPKTconst int *argp
Включает (если
*argp
не равно нулю) или отключает пакетный режим.
Может применяться только к оснвной части псевдо-tty (и будет возвращать
ENOTTY в другом случае). В пакетном режиме каждое последующее
read(2)
возвратит пакет, содержащий либо один ненулевой управляющий байт,
либо один нулевой байт с последующими данными, записанными на
подчиненной части pty. Если первые байты не равны TIOCPKT_DATA (0),
то они логически складываются (OR) с одним или несколькими
следующими битами:
TIOCPKT_FLUSHREAD The read queue for the terminal is flushed.
TIOCPKT_FLUSHWRITE The write queue for the terminal is flushed.
TIOCPKT_STOP Output to the terminal is stopped.
TIOCPKT_START Output to the terminal is restarted.
TIOCPKT_DOSTOP t_stopc is `^S' and t_startc is `^Q'.
TIOCPKT_NOSTOP the start and stop characters are not `^S/^Q'.
При использовании этого режима наличие управляющей информации,
считываемой с основной части может быть определено через
select(2)
для исключительных условий.
Этот режим используется
rlogin(1)
и
rlogind(8)
для реализации удаленного входа, откликающего дистанционно, локально управляемого `^S/^Q'.
Вызовы ioctl для BSD - TIOCSTOP, TIOCSTART, TIOCUCNTL, TIOCREMOTE -
не были реализованы в Linux.
Управление модемом
TIOCMGETint *argp
Получает статус битов модема.
TIOCMSETconst int *argp
Устанавливает статус битов модема.
TIOCMBICconst int *argp
Очищает указанные биты модема.
TIOCMBISconst int *argp
Устанавливает указанные биты модема.
Биты, используемые в этих четырех вызовах ioctl:
TIOCM_LE DSR (линия включена/данные готовы, Data Set Ready)
TIOCM_DTR DTR (терминал данных готов, Data Terminal Ready)
TIOCM_RTS RTS (запрос на отправку, Request To Send)
TIOCM_ST Вторичное TXD (передача, Secondary Transmit)
TIOCM_SR Вторичное RXD (получение, Secondary Receive)
TIOCM_CTS Готов к отправке CTS (Clear To Send)
TIOCM_CAR Обнаружены данные DCD (Data Carrier Detect)
TIOCM_CD см. TIOCM_CAR
TIOCM_RNG RNG (ring, звонок)
TIOCM_RI см. TIOCM_RNG
TIOCM_DSR Данные готовы DSR (Data Set Ready)
Пометка локальной линии
TIOCGSOFTCARint *argp
("Get software carrier flag")
Определяет статус флага CLOCAL в поле c_cflag структуры termios.
TIOCSSOFTCARconst int *argp
("Set software carrier flag")
Устанавливает флаг CLOCAL в поле c_cflag структуры termios при
*argp
не равном нулю или очищая его в противном случае.
Если флаг CLOCAL для линии не установлен, то важен сигнал DCD, а
signal is significant, а
open(2)
соответствующего tty будет блокировано, пока не будет утвержден DCD,
за исключением установленного флага O_NONBLOCK.
Если CLOCAL определено, то линия ведет себя, как если DCD утверждено
всегда. Поограммное определение сигнала обычно включено для
локальных устройств, и выключено для модемных линий.
Специфичность Linux
Для вызова ioctl TIOCLINUX смотрите
console_ioctl(4).
Системный вызов
ioctl()
возвращает 0 при нормальном завершении работы. При ошибках возвращается -1
и соответствующим образом устанавливается переменная
errno.
НАЙДЕННЫЕ ОШИБКИ
ENOIOCTLCMD
Неизвестная команда.
EINVAL
Некорректный параметр команды.
EPERM
Недостаточно прав.
ENOTTY
Несоответствующее
fd.
ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ
Проверка условия DTR на последовательном порту.
#include <termios.h>
#include <fcntl.h>
#include <sys/ioctl.h>
main() {
int fd, serial;
fd = open("/dev/ttyS0", O_RDONLY);
ioctl(fd, TIOCMGET, &serial);
if (serial & TIOCM_DTR)
puts("TIOCM_DTR is not set");
else
puts("TIOCM_DTR is set");
close(fd);
}