Интерфейс /dev/poll

Интерфейс /dev/poll

В Solaris имеется специальный файл /dev/poll, с помощью которого можно опрашивать большее количество дескрипторов файлов. Проблема select и poll состоит в том, что список дескрипторов приходится передавать при каждом вызове. Устройство опроса поддерживает информацию о состоянии между вызовами, так что программа может подготовить список подлежащих опросу дескрипторов, а потом спокойно зациклиться в опросе и не заполнять список каждый раз.

После открытия /dev/poll программа должна инициализировать массив структур pollfd (тех же, которые используются функцией poll, но в этом случае поле revents не используется). Затем массив передается ядру вызовом write (структура записывается непосредственно в /dev/poll). После этого программа может вызывать ioctl DP_POLL и ждать событий. При вызове ioctl передается следующая структура:

struct dvpoll {

 struct pollfd* dp_fds;

 int            dp_nfds;

 int            dp_timeout;

};

Поле dp_fds указывает на буфер, используемый для хранения массива структур pollfd, возвращаемых вызовом ioctl. Поле dp_nfds задает размер буфера. Вызов ioctl блокируется до появления интересующих программу событий на любом из опрашиваемых дескрипторов, или до прохождения dp_timeout миллисекунд. При нулевом значении тайм-аута функция ioctl возвращается немедленно (то есть данный способ может использоваться для реализации неблокируемых сокетов). Тайм-аут, равный -1, означает неопределенно долгое ожидание.

Измененный код функции str_cli, переписанной из листинга 6.2 с использованием /dev/poll, приведен в листинге 14.7.

Листинг 14.7. Функция str_cli, использующая /dev/poll

//advio/str_cli_poll03.c

 1 #include "unp.h"

 2 #include <sys/devpoll.h>

 3 void

 4 str_cli(FILE *fp, int sockfd)

 5 {

 6  int stdineof;

 7  char buf[MAXLINE];

 8  int n;

 9  int wfd;

10  struct pollfd pollfd[2];

11  struct dvpoll dopoll;

12  int i;

13  int result;

14  wfd = Open("/dev/poll", O_RDWR, 0);

15  pollfd[0].fd = fileno(fp);

16  pollfd[0].events = POLLIN;

17  pollfd[0].revents = 0;

18  pollfd[1].fd = sockfd;

19  pollfd[1].events = POLLIN;

20  pollfd[1].revents = 0;

21  Write(wfd, pollfd, sizeof(struct pollfd) * 2);

22  stdineof = 0;

23  for (;;) {

24   /* блокирование до готовности сокета */

25   dopoll.dp_timeout = -1;

26   dopoll.dp_nfds = 2;

27   dopoll.dp_fds = pollfd;

28   result = Ioctl(wfd, DP_POLL, &dopoll);

29   /* цикл по готовым дескрипторам */

30   for (i = 0; i < result; i++) {

31    if (dopoll.dp_fds[i].fd == sockfd) {

32     /* сокет готов к чтению */

33     if ((n = Read(sockfd, buf, MAXLINE)) == 0) {

34      if (stdineof == 1)

35       return; /* нормальное завершение */

36      else

37       err_quit("str_cli: server terminated prematurely");

38     }

39     Write(fileno(stdout), buf, n);

40    } else {

41     /* дескриптор готов к чтению */

42     if ((n = Read(fileno(fp), buf, MAXLINE)) == 0) {

43      stdineof = 1;

44      Shutdown(sockfd, SHUT_WR); /* отправка FIN */

45      continue;

46     }

47     Writen(sockfd, buf, n);

48    }

49   }

50  }

51 }

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

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

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

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

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

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Интерфейс

Из книги Microsoft Office автора Леонтьев Виталий Петрович

Интерфейс На самом деле Word – это не просто текстовый редактор (то есть, программа, предназначенная для создания и обработки текстов), а нечто гораздо большее. С помощью Word вы можете не просто набрать текст, но и оформить его по своему вкусу: включить в него таблицы и


Интерфейс

Из книги Windows Vista автора Леонтьев Виталий Петрович

Интерфейс ИНТЕРФЕЙС, графическая «оболочка», с помощью которой мы, пользователи, обращаемся к операционной системе. Интерфейс – это посредник, переводчик, задача которого преобразовать все внутренние «рычаги управления» Windows в понятную людям графическую


Интерфейс

Из книги Мобильный интернет автора Леонтьев Виталий Петрович

Интерфейс Spb Pocket Plus! Страница программы: http://www.spbsoftwarehouse.comСтатус: Shareware, $15Вам не кажется, что место на стартовом экране Windows Mobile можно было бы использовать куда рациональнее? Во всяком случае, у крупнейшей российской фирмы по производству мобильного софта такое ощущение


Интерфейс

Из книги Photoshop. Мультимедийный курс автора Мединов Олег

Интерфейс В категории Интерфейс (рис. 14.8) задают некоторые настройки, касающиеся интерфейса. Например, включить отображение цветовых каналов в их базовых цветах, включить или выключить появление всплывающих подсказок при подведении курсора к инструментам, режим


Интерфейс

Из книги Pinnacle Studio 11 автора Чиртик Александр Анатольевич

Интерфейс Пример внешнего вида Pinnacle Studio в режиме захвата приведен на рис. 2.1. Рис. 2.1. Studio в режиме захватаВ случае, показанном на рисунке, захват осуществляется с цифровой камеры. Поэтому в левой нижней части окна присутствует панель управления камерой (Контроллер


6.9. Использование select и poll с очередями сообщений

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

6.9. Использование select и poll с очередями сообщений Одним из недостатков очередей сообщений System V является то, что они идентифицируются не дескрипторами, а идентификаторами. Поэтому с ними нельзя использовать функции select и poll (глава 6 [24]). ПРИМЕЧАНИЕ На самом деле одна из


7.2 Интерфейс WMI

Из книги Серверные технологии хранения данных в среде Windows® 2000 Windows® Server 2003 автора Дайлип Наик

7.2 Интерфейс WMI Как уже отмечалось, модель CIM определена в рабочей группе DMTF и принята к использованию ассоциацией SNIA. Интерфейс WMI представляет собой реализацию модели CIM от Microsoft. Другими словами, WMI – это «CIM для Windows».Интерфейс WMI был разработан для режима ядра и


13.1.4. Сравнение poll() и select()

Из книги MySQL 5.0. Библиотека программиста автора Гольцман Виктор Иосифович

13.1.4. Сравнение poll() и select() Обладая одинаковой функциональностью, poll() и select() также имеют существенные отличия. Наиболее очевидным отличием является тайм-аут, поддерживающий миллисекундную точность для poll() и микросекундную точность для select(). В действительности же это


13.1.6 Сравнение poll() и epoll

Из книги Операционная система UNIX автора Робачевский Андрей М.

13.1.6 Сравнение poll() и epoll Методы poll() и epoll существенно отличаются; poll() хорошо стандартизован, но плохо масштабируется, в то время как epoll существует только в Linux, но очень хорошо масштабируется. Приложения, наблюдающие за небольшим количеством файловых дескрипторов и


4.1. Интерфейс с PHP

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

4.1. Интерфейс с PHP В этом разделе мы рассмотрим процесс создания веб-приложения на языке PHP, взаимодействующего с базой данных MySQL. Вначале познакомимся с платформами, на которых возможно создание такого приложения, а затем с функциями языка PHP, обеспечивающими работу с


Интерфейс TPI

Из книги Установка, настройка и восстановление Windows 7 на 100% автора Ватаманюк Александр Иванович

Интерфейс TPI


Глава 6 Мультиплексирование ввода-вывода: функции select и poll

Из книги Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода автора Larsson Thomas

Глава 6 Мультиплексирование ввода-вывода: функции select и poll 6.1. Введение В разделе 5.12 мы видели, что наш TCP-клиент обрабатывает два входных потока одновременно: стандартный поток ввода и сокет TCP. Проблема, с которой мы столкнулись, состояла в том, что пока клиент был


6.10. Функция poll

Из книги автора

6.10. Функция poll Функция poll появилась впервые в SVR3, и изначально ее применение ограничивалось потоковыми устройствами (STREAMS devices) (см. главу 31). В SVR4 это ограничение было снято, что позволило функции poll работать с любыми дескрипторами. Функция poll предоставляет


Интерфейс

Из книги автора

Интерфейс Интерфейс Windows 7 не претерпел каких-либо особых изменений по сравнению с внешним видом Windows Vista. Тем не менее кое-что новое в нем также имеется. Основные изменения коснулись оформления таких элементов и программ, как меню Пуск, Панель задач, область уведомлений,