Главная » 2016 » Март » 28 » select()
12:09
select()
Системный вызов se le c t () предоставляет механизм для реализации синхронногомультиплексированного ввода-вывода:finclude <sys/time.h>#include <sys/types.h>finclude <unistd.h>int select (int n,fd s e t *readfds,fd s e t *writefds.fd set *exceptfds,struct timeval *timeout):FD_CLR(int fd, fd set *set):FD_ISSET(int fd. fd s e t *set);FD_SET(int fd. fd set *set);FD_ZERO(fd_set *set);Вызов se le c tO блокируется до тех пор, пока указанный дескриптор файлане становится готовым к выполнению ввода-вывода, или же до тех пор, пока неистекает необязательный интервал тайм-аута.Наблюдаемые файловые дескрипторы разбиваются на три набора, в каждомиз которых ожидается свое событие. Дескрипторы файла в наборе readfds наблюдаютсяв ожидании момента, когда данные станут доступными для чтения(то есть можно будет выполнить операцию считывания без блокировки). Дескрипторы файла в наборе writefds наблюдаются в ожидании момента, когдаможно будет завершить без блокировки операцию записи. Наконец, файловыедескрипторы в наборе exceptfds наблюдаются с тем, чтобы отлавливатьсоздание исключений или появление внеполосных данных (эти состояния распространяютсятолько на сокеты). Каждый набор может содержать значениеNULL, и в этом случае вызов select( ) не отслеживает соответствующее событие.В случае успешного возвращения вызовом результата каждый набор модифицируется,и в нем остаются только дескрипторы файла, готовые к операцииввода-вывода, относящейся к этому набору. Например, предположим, что двадескриптора файла со значениями 7 и 9 помещены в набор readfds. Когда вызоввозвращает результат, если 7 все еще находится в наборе, эго означает, что соответствующийдескриптор файла готов к чтению без блокировки. Если значение9 удалено из набора, вероятно, считать соответствующий файл без блокировкиневозможно. (Я говорю ?вероятно?, потому что данные вполне могутстать доступными уже после того, как вызов завершится. В этом случае повторныйвызов selectO вернет файловый дескриптор как готовый к считыванию1.)Первый параметр, п, на единицу превышает максимальное во всех наборахзначение дескриптора файла. Следовательно, вызывающий функцию sel ect Одолжен проверить, у какого дескриптора максимальное значение, прибавитьк нему единицу и передать полученное в качестве первого параметра.Параметр timeout — это указатель на структуру timeval, которая определяетсяследующим образом:#include <sys/time.h>struct timeval {long tvsec: /* секунды */long tvusec: /* микросекунды */}:
Просмотров: 534 | Добавил: admin | Рейтинг: 0.0/0
Всего комментариев: 0
avatar