other versions
- wheezy 0.98-4
other sections
SELECT(2) | Руководство программиста Linux | SELECT(2) |
НАЗВАНИЕ¶
select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - синхронное мультиплексирование ввода-выводаКРАТКАЯ СВОДКА¶
#include <sys/time.h>ОПИСАНИЕ¶
Функции select и pselect ждут изменения статуса нескольких файловых дескрипторов. Они почти идентичны, только- (i)
- select использует тайм-аут в виде struct timeval (с секундами и микросекундами), тогда как pselect использует struct timespec (с секундами и наносекундами).
- (ii)
- Функция select может обновить параметр timeout, чтобы сообщить, сколько времени осталось. Функция pselect не изменяет этот параметр.
- (iii)
- Функция select не содержит параметра sigmask, и ведет себя как pselect с параметром sigmask, равным NULL.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
При успешном завершении select и pselect возвращают количество дескрипторов, находящихся в наборах дескрипторов, причем это количество может быть равным нулю, если тайм-аут истекает, а интересующие нас события так и не произошли. При ошибке возвращается -1, а errno устанавливается должным образом; наборы дескрипторов и значение timeout становятся неопределены, поэтому при ошибке нельзя полагаться на их значение.ОШИБКИ¶
- EBADF
- В одном из наборов находится неверный файловый дескриптор.
- EINTR
- Был пойман незаблокированный сигнал.
- EINVAL
- n отрицательно.
- ENOMEM
- Функция select не смогла выделить участок памяти для внутренних таблиц.
ЗАМЕЧАНИЕ¶
В некоторых программах select вызывается с тремя пустыми наборами файлов, n равным нулю, и ненулевым значением timeout, что является довольно переносимым способом сделать задержку с миллисекундной точностью. Под Linux timeout изменяется, чтобы сообщить количество времени, которое не было использовано; большинство других реализаций не делают этого. Это приводит к проблемам как в коде под Linux, который читает значение timeout и переносится в другие операционные системы, так и когда код переносится под Linux и использует при этом struct timeval для нескольких функций select в цикле без повторной инициализации. Считайте, что параметр timeout неопределен после возврата из функции select.ПРИМЕР¶
#include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int main(void) { fd_set rfds; struct timeval tv; int retval; /* Ждем, пока на стандартном вводе (fd 0) что-нибудь появится. */ FD_ZERO(&rfds); FD_SET(0, &rfds); /* Ждем не больше пяти секунд. */ tv.tv_sec = 5; tv.tv_usec = 0; retval = select(1, &rfds, NULL, NULL, &tv); /* Не полагаемся на значение tv! */ if (retval) printf("Данные доступны.\n"); /* Теперь FD_ISSET(0, &rfds) вернет истинное значение. */ else printf("Данные не появились в течение пяти секунд.\n"); exit(0); }
СООТВЕТСТВИЕ СТАНДАРТАМ¶
4.4BSD (функция select впервые появилась в 4.2BSD). Обычно переносится с/на не-BSD системы, поддерживающие уровень BSD-сокетов (включая варианты System V). Однако заметьте, что варианты System V обычно устанавливают значение переменной timeout перед выходом, а вариант BSD -- нет. Функция pselect определена в IEEE Std 1003.1g-2000 (POSIX.1g). Ее можно найти в glibc2.1 и позднее. Glibc2.0 содержит функцию с таким именем, но без параметра sigmask.СМОТРИ ТАКЖЕ¶
accept(2), connect(2), poll(2), read(2), recv(2), send(2), sigprocmask(2), write(2)ПЕРЕВОД¶
Copyright (C) Alexey Mahotkin <alexm@hsys.msk.ru> 2000-200111 февраля 1996 | Linux 1.2 |