UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Мы поговорим о функции
pselectpselectЕсть одно незначительное различие между функциями select и pselect. Первый элемент структуры timeval является целым числом типа long со знаком, в то время как первый элемент структуры timspec имеет тип time_t. Число типа long со знаком в первой функции также должно было относиться к типу time_t, но мы не меняли его тип, чтобы не разрушать существующего кода. Однако в новой функции это можно было бы сделать.
6.10. Функция poll
Функция
pollpollpollselect#include <poll.h>int poll(struct pollfd *<i>fdarray</i>, unsigned long <i>nfds</i>, int <i>timeout</i>);<i>Возвращает: количество готовых дескрипторов, 0 в случае тайм-аута, -1 в случае ошибки</i>Первый аргумент — это указатель на первый элемент массива структур. Каждый элемент массива — это структура
pollfdfdstruct pollfd { int fd; /* дескриптор, который нужно проверить */ short events; /* события на дескрипторе, которые нас интересуют */ short revents; /* события, произошедшие на дескрипторе fd */};Проверяемые условия задаются элементом
eventsreventsselecteventsreventsТаблица 6.2. Различные значения флагов events и revents для функции poll
| Константа | На входе (events) | На выходе (revents) | Описание |
|---|---|---|---|
| POLLIN | • | • | Можно считывать обычные или приоритетные данные |
| POLLRDNORM | • | • | Можно считывать обычные данные |
| POLLRDBAND | • | • | Можно считывать приоритетные данные |
| POLLPRI | • | • | Можно считывать данные с высоким приоритетом |
| POLLOUT | • | • | Можно записывать обычные данные |
| POLLWRNORM | • | • | Можно записывать обычные данные |
| POLLWRBAND | • | • | Можно записывать приоритетные данные |
| POLLERR | • | Произошла ошибка | |
| POLLHUP | • | Произошел разрыв соединения | |
| POLLNVAL | • | Дескриптор не соответствует открытому файлу |
Мы разделили эту таблицу на три части: первые четыре константы относятся ко вводу, следующие три — к выводу, а последние три — к ошибкам. Обратите внимание, что последние три константы не могут устанавливаться в элементе events, но всегда возвращаются в revents, когда выполняется соответствующее условие.
Существует три класса данных, различаемых функцией
pollКонстанта POLLIN может быть задана путем логического сложения констант POLLRDNORM и POLLRDBAND. Константа POLLIN существовала еще в реализациях SVR3, которые предшествовали полосам приоритета в SVR4, то есть эта константа существует в целях обратной совместимости. Аналогично, константа POLLOUT эквивалентна POLLWRNORM, и первая из них предшествовала второй.
Для сокетов TCP и UDP при описанных условиях функция
pollreventpoll■ Все регулярные данные TCP и все данные UDP считаются обычными.
■ Внеполосные данные TCP (см. главу 24) считаются приоритетными.
■ Когда считывающая половина соединения TCP закрывается (например, если получен сегмент FIN), это также считается равнозначным обычным данным, и последующая операция чтения возвратит нуль.
■ Наличие ошибки для соединения TCP может расцениваться либо как обычные данные, либо как ошибка (
POLLERRerrno■ Информация о доступности нового соединения на прослушиваемом сокете может считаться либо обычными, либо приоритетными данными. В большинстве реализаций эта информация рассматривается как обычные данные.
Число элементов в массиве структур задается аргументом
nfds
