Книга: UNIX: разработка сетевых приложений
17.2. Функция ioctl
17.2. Функция ioctl
Эта функция работает с открытым файлом, дескриптор которого передается через аргумент fd
.
#include <unistd.h>
int ioctl(int fd, int request, ... /* void *arg */ );
Возвращает: 0 в случае успешного выполнения, -1 в случае ошибки
Третий аргумент всегда является указателем, но тип указателя зависит от аргумента request
.
ПРИМЕЧАНИЕ
В 4.4BSD второй аргумент имеет тип unsigned long вместо int, но это не вызывает проблем, поскольку в заголовочных файлах определены константы, используемые для данного аргумента. Пока прототип функции подключен к программе, система будет обеспечивать правильную типизацию.
Некоторые реализации определяют третий аргумент как неопределенный указатель (void*), а не так, как он определен в ANSI С.
Не существует единого стандарта заголовочного файла, определяющего прототип функции для ioctl, поскольку он не стандартизован в POSIX. Многие системы определяют этот прототип в файле <unistd.h>, как это показываем мы, но традиционные системы BSD определяют его в заголовочном файле <sys/ioctl.h>.
Мы можем разделить аргументы request
, имеющие отношение к сети, на шесть категорий:
? операции с сокетами;
? операции с файлами;
? операции с интерфейсами;
? операции с кэшем ARP;
? операции с таблицей маршрутизации;
? операции с потоками (см. главу 31).
Помимо того, что, как показывает табл. 7.9, некоторые операции ioctl
перекрывают часть операций fcntl
(например, установка неблокируемого сокета), существуют также некоторые операции, которые с помощью функции ioctl
можно задать более чем одним способом (например, смена групповой принадлежности сокета).
В табл. 17.1 перечислены аргументы request вместе с типами данных, на которые должен указывать адрес arg
. В последующих разделах эти вызовы рассматриваются более подробно.
Таблица 17.1. Обзор сетевых вызовов ioctl
Категория | request | Описание | Тип данных |
---|---|---|---|
Сокет | SIOCATMARK | Находится ли указатель чтения сокета на отметке внеполосных данных | int |
SIOCSPGRP | Установка идентификатора процесса или идентификатора группы процессов для сокета | int | |
SIOCGPGRP | Получение идентификатора процесса или идентификатора группы процессов для сокета | int | |
Файл | FIONBIO | Установка/сброс флага отсутствия блокировки | int |
FIOASYNC | Установка/сброс флага асинхронного ввода-вывода | int | |
FIONREAD | Получение количества байтов в приемном буфере | int | |
FIOSETOWN | Установка идентификатора процесса или идентификатора группы процессов для файла | int | |
FIOGETOWN | Получение идентификатора процесса или идентификатора группы процессов для файла | int | |
Интерфейс | SIOCGIFCONF | Получение списка всех интерфейсов | struct ifconf |
SIOCSIFADDR | Установка адреса интерфейса | struct ifreq | |
SIOCGIFADDR | Получение адреса интерфейса | struct ifreq | |
SIOCSIFFLAGS | Установка флагов интерфейса | struct ifreq | |
SIOCGIFFLAGS | Получение флагов интерфейса | struct ifreq | |
SIOCSIFDSTADDR | Установка адреса типа «точка-точка» | struct ifreq | |
SIOCGIFDSTADDR | Получение адреса типа «точка-точка» | struct ifreq | |
SIOCGIFBRDADDR | Получение широковещательного адреса | struct ifreq | |
SIOCSIFBRDADDR | Установка широковещательного адреса | struct ifreq | |
SIOCGIFNETMASK | Получение маски подсети | struct ifreq | |
SIOCSIFNETMASK | Установка маски подсети | struct ifreq | |
SIOCGIFMETRIC | Получение метрики интерфейса | struct ifreq | |
SIOCSIFMETRIC | Установка метрики интерфейса | struct ifreq | |
SIOCxxx | (Множество вариантов в зависимости от реализации) | ||
ARP | SIOCSARP | Создание/модификация элемента ARP | struct arpreq |
SIOCGARP | Получение элемента ARP | struct arpreq | |
SIOCDARP | Удаление элемента ARP | struct arpreq | |
Маршрутизация | SIOCADDRT | Добавление маршрута | struct rtentry |
SIOCDELRT | Удаление маршрута | struct rtentry | |
Потоки | I_xxx | (См. раздел 31.5) |
- Глава 17 Операции функции ioctl
- 17.6. Функция get_ifi_info
- 6.7. Функция ioctl()
- 10.1.2.5 Ioctl
- 7.11. Функция fcntl
- 31.5. Функция ioctl
- 2.1.3. Функция getopt_long()
- Группировка по встроенным функциям и UDF
- 19.1.1. Функция jQuery()
- Функция strcmp( )
- Управление функциями узла
- Функция программного обеспечения