Шрифт:
17.2. Функция ioctl
Эта функция работает с открытым файлом, дескриптор которого передается через аргумент
Третий аргумент всегда является указателем, но тип указателя зависит от аргумента
В 4.4BSD второй аргумент имеет тип unsigned long вместо int, но это не вызывает проблем, поскольку в заголовочных файлах определены константы, используемые для данного аргумента. Пока прототип функции подключен к программе, система будет обеспечивать правильную типизацию.
Некоторые реализации определяют третий аргумент как неопределенный указатель (void*), а не так, как он определен в ANSI С.
Не существует единого стандарта заголовочного файла, определяющего прототип функции для ioctl, поскольку он не стандартизован в POSIX. Многие системы определяют этот прототип в файле <unistd.h>, как это показываем мы, но традиционные системы BSD определяют его в заголовочном файле <sys/ioctl.h>.
Мы можем разделить аргументы
операции с сокетами;
операции с файлами;
операции с интерфейсами;
операции с кэшем ARP;
операции с таблицей маршрутизации;
операции с потоками (см. главу 31).
Помимо того, что, как показывает табл. 7.9, некоторые операции
В табл. 17.1 перечислены аргументы request вместе с типами данных, на которые должен указывать адрес
Таблица 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 | |
SIOC xxx | (Множество вариантов в зависимости от реализации) | ||
ARP | SIOCSARP | Создание/модификация элемента ARP | struct arpreq |
SIOCGARP | Получение элемента ARP | struct arpreq | |
SIOCDARP | Удаление элемента ARP | struct arpreq | |
Маршрутизация | SIOCADDRT | Добавление маршрута | struct rtentry |
SIOCDELRT | Удаление маршрута | struct rtentry | |
Потоки | I_ xxx | (См. раздел 31.5) |
17.3. Операции с сокетами
Существует три типа вызова, или запроса (в зависимости от значения аргумента
17.4. Операции с файлами
Следующая группа вызовов начинается с
Следующие пять вызовов требуют, чтобы третий аргумент функции