Управляет дескрипторами сокетов
- Прототип
-
#include <sys/unistd.h>
#include <sys/fcntl.h>
int fcntl(int s, int cmd, long arg);
- Описание
-
Вообще-то эта функция относится к файловым операциям, но у нее есть также пара сокето-ориентированных применений.
Параметр s - дескриптор нужного сокета, cmd должна быть F_SETFL, а
arg может быть одной из следующих команд. (Учти, что fcntl() имеет больше команд, но здесь мы рассматриваем сокеты.)
O_NONBLOCK |
Сделать сокет неблокирующим. Смотри раздел о блокировании. |
O_ASYNC |
Сделать сокет асинхронным. Когда в сокет приходят данные, передается сигнал SIGIO. Это редко используется, и выходит за рамки этого руководства. И, кажется, это доступно не на всех системах. |
- Возвращаемое значение
-
Возвращает ноль при успехе, -1 при ошибке, сохраняя ее номер в errno.
На самом деле разные применения fcntl() возвращают разные значения, но я их не рассматриваю, так как они не относятся к сокетам. Подсмотри fcntl() в справке.
- Пример
-
int s = socket(PF_INET, SOCK_STREAM, 0);
fcntl(s, F_SETFL, O_NONBLOCK); // сделать неблокирующим
fcntl(s, F_SETFL, O_ASYNC); // сделать асинхронным
|
- См. также
-
Блокирование,
send()
|