Управлять устройством
#include <sys/ioctl.h>int ioctl( int fd,int request,... );int ioctl_socket( int fd,int request,... );
<sys/ioctl.h>
.
Функция ioctl() управляет параметрами файла. В частности, функция может быть использована для управления многими атрибутами файла (например, атрибутами терминала).
Функция ioctl_socket() является оптимизированной версией функции ioctl(), обеспечивает специальную обработку команд, использующих внутренние указатели (смотрите “Команды со специальной обработкой ioctl_socket()” ниже). Эта функция использует ioctl() для команд, не требующих специальной обработки. Аргумент fd является сокетом для ioctl_socket().
ioctl() обрабатывает внутренние указатели, поэтому не нужно использовать вместо неё ioctl_socket(). |
Аргумент request определяет, являются последующие аргументы входными или выходными параметрами; также указывает размер аргументов в байтах.
Сопоставление команд ioctl() с другими командами
Часть команд ioctl() преобразуется в вызовы fcntl(), tcgetattr(), tcsetattr(), и tcsetsid(). Другая часть преобразуются в команды devctl(), остальные без изменений передаются devctl(). Команды приведены ниже:
команда ioctl() | Описание | Сопоставление: |
---|---|---|
FIOASYNC | Установить или очистить асинхронный ввод/вывод | fcntl(): F_GETFL (вызывает devctl() с DCMD_ALL_GETFLAGS), затем fcntl(): F_SETFL (вызывает devctl() с DCMD_ALL_SETFLAGS), с установкой или очисткой O_ASYNC |
FIOCLEX | Установить флаг закрытия при исполнении exec*()/spawn*() (close-on-exec) для файлового дескриптора | fcntl(): F_SETFD с FD_CLOEXEC |
FIOGETOWN | Получить владельца | fcntl(): F_GETOWN |
FIONBIO | Установить или очистить неблокирующий ввод/вывод | fcntl(): F_GETFL (вызывает devctl() с DCMD_ALL_GETFLAGS), за ней следует fcntl(): F_SETFL (вызывает devctl() с DCMD_ALL_SETFLAGS), с установкой или очисткой O_NONBLOCK |
FIONCLEX | Удалить флаг закрытия при исполнении exec*()/spawn*() (close-on-exec) для файлового дескриптора | fcntl(): F_SETFD с ~FD_CLOEXEC |
FIONREAD | Получить количество байт, которое необходимо прочитать | devctl(): DCMD_CHR_ISCHARS |
FIOSETOWN | Установить владельца | fcntl(): F_SETOWN |
NOSIOCGIFCONF | Получить список сетевых интерфейсов | Передаётся в devctl() |
OSIOCGIFADDR | Получить адрес сетевого интерфейса | Передаётся в devctl() |
OSIOCGIFBRDADDR | Получить широковещательный адрес | Передаётся в devctl() |
OSIOCGIFCONF | Получить список сетевых интерфейсов | Передаётся в devctl() |
OSIOCGIFDSTADDR | Получить адрес p2p (point-to-point) | Передаётся в devctl() |
OSIOCGIFNETMASK | Получить маску сетевого адреса | Передаётся в devctl() |
SIOCADDMULTI | Добавить мультикаст адрес | Передаётся в devctl() |
SIOCADDRT | Добавить маршрут | Передаётся в devctl() |
SIOCAIFADDR | Добавить или изменить псевдоним интерфейса | Передаётся в devctl() |
SIOCALIFADDR | Добавить адрес интерфейса | Передаётся в devctl() |
SIOCATMARK | На нештатной (out-of-band ) отметке? | Передаётся в devctl() |
SIOCDARP | Удалить ARP запись | Передаётся в devctl() |
SIOCDELMULTI | Удалить мультикаст адрес | Передаётся в devctl() |
SIOCDELRT | Удалить маршрут | Передаётся в devctl() |
SIOCDIFADDR | Удалить адрес интерфейса | Передаётся в devctl() |
SIOCDIFPHYADDR | Удалить адрес gif | Передаётся в devctl() |
SIOCDLIFADDR | Удалить адрес интерфейса | Передаётся в devctl() |
SIOCGARP | Получить ARP запись | Передаётся в devctl() |
SIOCGDRVSPEC | Получить специфичные параметры драйвера | Передаётся в devctl() |
SIOCGETSGCNT | Получить количество пакетов исходной группы | Передаётся в devctl() |
SIOCGETVIFCNT | Получить количество пакетов виртуального интерфейса | Передаётся в devctl() |
SIOCGHIWAT | Получить значение высокого порога срабатывания | Передаётся в devctl() |
SIOCGIFADDR | Получить адрес интерфейса | Передаётся в devctl() |
SIOCGIFALIAS | Получить псевдоним интерфейса | Передаётся в devctl() |
SIOCGIFASYNCMAP | Получить ppp asyncmap | Передаётся в devctl() |
SIOCGIFBRDADDR | Получить широковещательный адрес | Передаётся в devctl() |
SIOCGIFCAP | Получить характеристики | Передаётся в devctl() |
SIOCGIFCONF | Вернуть список адресов интерфейса (транспортный уровень) | Передаётся в devctl() |
SIOCGIFDLT | Получить тип канала передачи данных | Передаётся в devctl() |
SIOCGIFDSTADDR | Получить p2p адрес | Передаётся в devctl() |
SIOCGIFFLAGS | Получить флаги интерфейса | Передаётся в devctl() |
SIOCGIFGENERIC | Общий интерфейс запроса | Передаётся в devctl() |
SIOCGIFMEDIA | Получить сетевой режим; ioctl_socket() обеспечивает специальную обработку данной команды. | Передаётся в devctl() |
SIOCGIFMETRIC | Получить метрики интерфейса | Передаётся в devctl() |
SIOCGIFMTU | Получить MTU сетевого интерфейса | Передаётся в devctl() |
SIOCGIFNETMASK | Получить маску сетевого адреса | Передаётся в devctl() |
SIOCGIFPDSTADDR | Получить адрес gif pdst | Передаётся в devctl() |
SIOCGIFPSRCADDR | Получить адрес gif psrc | Передаётся в devctl() |
SIOCGLIFADDR | Получить адрес интерфейса | Передаётся в devctl() |
SIOCGLIFPHYADDR | Получить адрес gif | Передаётся в devctl() |
SIOCGLOWAT | Получить значение низкого порога срабатывания | Передаётся в devctl() |
SIOCGPGRP | Получить группу процесса | fcntl(): F_GETOWN |
SIOCIFCREATE | Клонировать интерфейс | Передаётся в devctl() |
SIOCIFDESTROY | Уничтожить клонированный интерфейс | Передаётся в devctl() |
SIOCIFGCLONERS | Получить список клонируемых интерфейсов; ioctl_socket() обеспечивает специальную обработку данной команды. | Передаётся в devctl() |
SIOCSARP | Установить ARP запись | Передаётся в devctl() |
SIOCSDRVSPEC | Задать специфичные для драйвера параметры | Передаётся в devctl() |
SIOCSHIWAT | Установить значение высокого порога срабатывания | Передаётся в devctl() |
SIOCSIFADDR | Задать адрес сетевого интерфейса | Передаётся в devctl() |
SIOCSIFASYNCMAP | Задать ppp asyncmap | Передаётся в devctl() |
SIOCSIFBRDADDR | Задать широковещательный адрес | Передаётся в devctl() |
SIOCSIFCAP | Задать характеристики | Передаётся в devctl() |
SIOCSIFDSTADDR | Задать p2p адрес | Передаётся в devctl() |
SIOCSIFFLAGS | Задать флаги интерфейса | Передаётся в devctl() |
SIOCSIFGENERIC | Общий интерфейс установки | Передаётся в devctl() |
SIOCSIFMEDIA | Задать сетевой режим | Передаётся в devctl() |
SIOCSIFMETRIC | Задать метрики интерфейса | Передаётся в devctl() |
SIOCSIFMTU | Задать MTU сетевого интерфейса | Передаётся в devctl() |
SIOCSIFNETMASK | Задать маску сетевого адреса | Передаётся в devctl() |
SIOCSIFPHYADDR | Задать адрес gif | Передаётся в devctl() |
SIOCSLIFPHYADDR | Задать gif адреса | Передаётся в devctl() |
SIOCSLOWAT | Задать значение низкого порога срабатывания | Передаётся в devctl() |
SIOCSPGRP | Задать группу процесса | fcntl(): F_SETOWN |
TCFLSH | Очистить буферы | Передаётся в devctl() |
TCGETA | Заполнить структуру termio свойствами терминала | tcgetattr() |
TCGETS | Заполнить структуру struct termios свойствами терминала | tcgetattr() |
TCSBRK | Установить сигнал break на период времени | devctl() : DCMD_CHR_SERCTL |
TCSETA | Задать свойства терминала | tcsetattr() |
TCSETAF | Задать свойства терминала после ожидания записи всех переданных данных и отбросить любые полученные, но непрочитанные данные | tcsetattr() |
TCSETAW | Задать свойства терминала после ожидания записи всех переданных данных | tcsetattr() |
TCSETS | Установить свойства терминала, указанные в структуре struct termios | devctl() : DCMD_CHR_TCSETATTR |
TCSETSF | Очистить вывод и ввод, и установить | Передаётся в devctl() |
TCSETSW | Очистить вывод, установить | Передаётся в devctl() |
TCXONC | Выполнить операцию управления потоком данных | devctl(): DCMD_CHR_TCFLOW |
TIOCCBRK | Очистить бит сигнала разрыва (break) | tcsetattr() |
TIOCCDTR | Очистить DTR | devctl() : DCMD_CHR_LINESTATUS , затем DCMD_CHR_SERCTL |
TIOCDRAIN | Ожидать, пока вывод будет опустошён | devctl(): DCMD_CHR_TCDRAIN |
TIOCEXCL | Установить эксклюзивное использование псевдотерминала (tty) | fcntl(): F_SETLK |
TIOCFLUSH | Очистить буферы | devctl(): DCMD_CHR_TCFLUSH |
TIOCGETA | Заполнить структуру struct termios свойствами терминала | devctl() : DCMD_CHR_TCGETATTR |
TIOCGETC | Получить специальные символы | tcgetattr() |
TIOCGETP | Заполнить структуру sgttyb с параметрами терминала | tcgetattr() |
TIOCGETPGRP | Получить группу процесса tty (POSIX) | Передаётся в devctl() |
TIOCGLTC | Получить локальные специальные символы | tcgetattr() |
TIOCGPGRP | Получить группу процесса tty | devctl(): DCMD_CHR_TCGETPGRP |
TIOCGSIZE | Получить размер окна | devctl(): DCMD_CHR_GETSIZE |
TIOCGWINSZ | Получить размер окна | devctl(): DCMD_CHR_GETSIZE |
TIOCHPCL | Остановиться при последнем закрытии | tcsetattr() |
TIOCLGET | Получить локальные режимы | tcgetattr() |
TIOCLSET | Установить локальный режим | tcsetattr() |
TIOCMBIC | Очистить биты модема | devctl() : DCMD_CHR_LINESTATUS , затем DCMD_CHR_SERCTL |
TIOCMBIS | Установить биты модема | devctl() : DCMD_CHR_LINESTATUS , затем DCMD_CHR_SERCTL |
TIOCMGET | Получить состояние линий модема | devctl() : DCMD_CHR_SERCTL |
TIOCMSET | Установить все биты модема | Передаётся в devctl() |
TIOCNOTTY | Сделать данный терминал неконтролирующим для процесса | tcsetsid() |
TIOCNXCL | Сбросить эксклюзивное использование tty | fcntl(): F_SETLK |
TIOCOUTQ | Размер очереди на вывод | devctl(): DCMD_CHR_OSCHARS |
TIOCPKT | Псевдотерминал: задать/очистить пакетный режим | Передаётся в devctl() |
TIOCSBRK | Установить бит разрыва | Передаётся в devctl() |
TIOCSCTTY | Сделать терминал управляющим tty | tcsetsid() |
TIOCSDTR | Установить DTR | devctl() : DCMD_CHR_LINESTATUS , затем DCMD_CHR_SERCTL |
TIOCSETA | Задать свойства терминал из структуры struct termios | devctl() : DCMD_CHR_TCSETATTR |
TIOCSETAF | Опустошить вывод, очистить ввод | devctl(): DCMD_CHR_TCSETATTRF |
TIOCSETAW | Очистить вывод | devctl(): DCMD_CHR_TCSETATTRD |
TIOCSETC | Задать специальные символы | tcsetattr() |
TIOCSETN | Аналогично TIOCSETP , но изменения вносятся сразу, без сброса данных. | tcsetattr() |
TIOCSETP | Установить параметры терминала из структуры sgttyb . Изменения не вносятся до тех пор, пока не будут переданы все записанные данные, после чего полученные, но непрочитанные данные будут очищены. | tcsetattr() |
TIOCSETPGRP | Задать группу процесса tty (POSIX) | Передаётся в devctl() |
TIOCSINUSE | Задать эксклюзивное использование tty | fcntl(): F_SETLK |
TIOCSLTC | Задать локальные специальные символы | tcsetattr() |
TIOCSPGRP | Задать группу процесса tty | devctl(): DCMD_CHR_TCSETPGRP |
TIOCSSIZE | Задать размер окна | devctl(): DCMD_CHR_SETSIZE |
TIOCSTART | Начать вывод, аналог Ctrl-Q | Передаётся в devctl() |
TIOCSTI | Имитация ввода | devctl(): DCMD_CHR_TCINJECTC |
TIOCSTOP | Остановить вывод, аналог Ctrl-S | Передаётся в devctl() |
TIOCSWINSZ | Установить размер окна | devctl(): DCMD_CHR_SETSIZE |
UIOCCMD | Пользовательская команда n | Передаётся в devctl() |
При разработке менеджера ресурсов необходимо обратить внимание, что функция iofunc_devctl_default() обрабатывает команды DCMD_ALL_GETFLAGS и DCMD_ALL_SETFLAGS; разрабатываемому менеджеру ресурсов необходимо обрабатывать все остальные применимые к нему команды devctl(). |
__Команды со специальной обработкой _ioctl_socket()___
Функция ioctl_socket() обеспечивает специальную обработку команд, перечисленных ниже. Если не указано обратное, команда передаётся функции devctl().
Команды для пакетного фильтра Беркли (BPF):
Команды для криптографии:
/dev/crypto
вызовом open(). В ЗОСРВ «Нейтрино» это необязательно, но данная возможность предусмотрена для совместимости и переносимости. Следующие команды используются для интерфейса пакетной фильтрации; для дополнительной информации см. описание pf:
Команды для сокетов:
Значение зависит от запроса.
Если возникла ошибка, функция возвращает -1
, код ошибки записывается в errno.
POSIX 1003.1 X/Open Systems Interfaces Streams
ioctl() - это Unix-функция, сильно различающаяся для разных платформ.
devctl(), fcntl(), struct termios, tcgetattr(), tcsetattr(), tcsetsid().
Предыдущий раздел: Описание API системной библиотеки