Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

47 Writen(sockfd, buf, n);

48 }

49 }

50 }

51 }

Составление списка дескрипторов для /dev/poll

14-21
Заполнив массив структур
pollfd
, мы передаем его в
/dev/poll
. В нашем примере используются только два файловых дескриптора, так что мы помещаем их в статический массив. На практике программы, использующие
/dev/poll
, обычно следят за сотнями или даже тысячами дескрипторов одновременно, поэтому массив выделяется динамически.

Ожидание данных

24-28
Программа не вызывает
select
, а блокируется в вызове
ioctl
в ожидании поступления данных. Возвращаемое значение представляет собой количество готовых к чтению дескрипторов файлов.

Цикл по дескрипторам

30-49
Наша программа относительно проста, потому что мы знаем, что дескрипторов всего два. В большой программе цикл будет более сложным. Возможно даже разделение программы на потоки для обработки данных, полученных по разным дескрипторам.

Интерфейс kqueue

Система FreeBSD версии 4.1 предложила сетевым программистам новый интерфейс, получивший название

kqueue
. Этот интерфейс позволяет процессу зарегистрировать фильтр событий, описывающий интересующие данный процесс события
kqueue
. К событиям этого типа относятся операции ввода-вывода с файлами и тайм-ауты, а также асинхронный ввод-вывод, уведомление об изменении файлов и обработка сигналов.

#include <sys/types.h>

#include <sys/event.h>

#include <sys/time.h>

int kqueue(void);

int kevent(int kq, const struct kevent * changelist, int nchanges,

struct kevent * eventlist, int nevents, const struct timespec * timeout);

void EV_SET(struct kevent * kev, uintptr_t ident, short filter,

u_short flags, u_int fflags, intptr_t data, void * udata);

Функция

kqueue
возвращает новый дескриптор
kqueue
, который может использоваться в последующих вызовах
kevent
. Функция
kevent
применяется для регистрации интересующих событий, а также для получения уведомлений об этих событиях. Параметры
changelist
и
nchanges
описывают изменения в предыдущем варианте списка событий. Если
nchanges
отлично от нуля, выполняются все запрошенные в структуре
changelist
изменения. Функция
kevent
возвращает количество событий или нуль, если произошел выход по тайм-ауту. В аргументе
timeout
хранится значение тайм-аута, обрабатываемое подобно тому, как при вызове
select
(
NULL
для блокирования, ненулевое значение для задания конкретного тайм- аута, а нулевое значение трактуется как необходимость неблокирующего вызова). Обратите внимание, что параметр
timeout
имеет тип
struct timespec
, отличающийся от
struct timeval
в вызове
select
тем, что первый имеет наносекундное разрешение, а второй — микросекундное.

Структура

kevent
определяется в заголовочном файле
<sys/event.h>
:

struct kevent {

uintptr_t ident; /* идентификатор (например, дескриптор файла) */

short filter; /* тип фильтра (например, EVFILT_READ) */

u_short flags; /* флаги действий (например, EV_ADD); */

u_int fflags; /* флаги, относящиеся к конкретным фильтрам */

intptr_t data; /* данные, относящиеся к конкретным фильтрам */

void uidata; /* непрозрачные пользовательские данные */

};

Действия по смене фильтра и флаговые возвращаемые значения приведены в табл. 14.5.

Таблица 14.5. Флаги для операций kevent

  • Читать дальше
  • 1
  • ...
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку:

Значение flags Описание Изменяется Возвращается
EV_ADD Добавить новое событие, подразумевается по умолчанию, если не указан флаг EV_DISABLE •
EV_CLEAR Сброс состояния события после считывания его пользователем •
EV_DELETE Удаление события из фильтра •
EV_DISABLE Отключение события без удаления его из фильтра •
EV_ENABLE Включение отключенного перед этим события •
EV_ONESHOT Удаление события после его однократного срабатывания •