Операция | fcntl | ioctl | Маршрутизирующий сокет | Posix.1g |
---|---|---|---|---|
Установка сокета для неблокируемого ввода-вывода | F_SETFL, O_NONBLOCK | FIONBIO | fcntl | |
Установка сокета для ввода-вывода, управляемого сигналом | F_SETFL, O_ASYNC | FIOASYNC | fcntl | |
Установка владельца сокета | F_SETOWN | SIOCSPGRP или FIOSETOWN | fcntl | |
Получение владельца сокета | F_GETOWN | SIOCGPGRP или FIOGETOWN | fcntl | |
Получение текущего количества байтов в приемном буфере сокета | FIONREAD | |||
Проверка, находится ли процесс на отметке внеполосных данных | SIOCATMARK | sockatmark | ||
Получение списка интерфейсов | SIOCGIFCONF | Sysctl | ||
Операции интерфейсов | SIOC[GS]IF | |||
Кэш-операции ARP | SIOC | RTM_ | ||
Операции таблицы маршрутизации | SIOG | RTM_ |
Первые шесть операций могут применяться к сокетам любым процессом, следующие две (операции над интерфейсами) используются реже, а последние две (ARP и таблица маршрутизации) выполняются администрирующими программами, такими как ifconfig
route
. О различных операциях функции ioctl
мы поговорим подробнее в главе 17, а о маршрутизирующих сокетах — в главе 18.Существует множество способов выполнения первых четырех операций, но, как указано в последней колонке, стандарт POSIX определяет, что функция fcntl
sockatmark
(см. раздел 24.3) как наиболее предпочтительный способ тестирования на предмет пребывания процесса на отметке внеполосных данных. Оставшиеся операции с пустой последней колонкой не стандартизованы POSIX.Отметим также, что первые две операции, устанавливающие сокет для неблокируемого ввода-вывода и для ввода-вывода, управляемого сигналом, традиционно применялись с использованием команд FNDELAY и FASYNC функции fcntl. POSIX определяет константы О_
Функция fcntl
■ Неблокируемый ввод-вывод. Мы можем установить флаг состояния файла O_NONBLOCK
F_SETFL
для отключения блокировки сокета. Неблокируемый ввод-вывод мы описываем в главе 16.■ Управляемый сигналом ввод-вывод. Мы можем установить флаг состояния файла O_ASYNC
F_SETFL
, после чего при изменении состояния сокета будет генерироваться сигнал SIGIO. Мы рассмотрим это в главе 25.■ Команда F_SETOWN
SIGIO
и SIGURG
. Первый сигнал генерируется, если для сокета включен управляемый сигналом ввод-вывод (см. главу 25), второй — когда для сокета приходят новые внеполосные (out-of-band data) данные (см. главу 24). Команда F_GETOWN
возвращает текущего владельца сокета.Термин «владелец сокета» определяется POSIX. Исторически реализации, происходящие от Беркли, называли его «идентификатор группы процессов сокета», потому что переменная, хранящая этот идентификатор, — это элемент so_pgid структуры socket [128, с. 438].
#include
int fcntl(int
Каждый дескриптор (включая сокет) имеет набор флагов, которые можно получить с помощью команды F_GETFL
F_SETFL
. На сокет влияют следующие два флага:■ O_NONBLOCK
■ O_ASYNC
Позже мы опишем оба эти флага подробнее. Отметим, что типичный код, который устанавливает неблокируемый ввод-вывод с использованием функции fcntl
int flags;
/* Делаем сокет неблокируемым */