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

Тут можно читать онлайн Уильям Стивенс - UNIX: разработка сетевых приложений - бесплатно ознакомительный отрывок. Жанр: comp-osnet, издательство Питер, год 2007. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    UNIX: разработка сетевых приложений
  • Автор:
  • Жанр:
  • Издательство:
    Питер
  • Год:
    2007
  • Город:
    Санкт-Петербург
  • ISBN:
    5-94723-991-4
  • Рейтинг:
    4.33/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

UNIX: разработка сетевых приложений - описание и краткое содержание, автор Уильям Стивенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.

UNIX: разработка сетевых приложений - читать онлайн бесплатно ознакомительный отрывок

UNIX: разработка сетевых приложений - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Уильям Стивенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

6.9. Функция pselect

Функция pselectбыла введена в POSIX и в настоящий момент поддерживается множеством версий Unix.

#include

#include

#include

int pselect(int maxfdp1 , fd_set * readset , fd_set * writeset , fd_set * exceptset ,

const struct timespec * timeout , const sigset_t * sigmask );

Возвращает: количество готовых дескрипторов, 0 в случае тайм-аута, -1 в случае ошибки

Функция pselectимеет два отличия от обычной функции select:

1. Функция pselectиспользует структуру timespec, нововведение стандарта реального времени POSIX, вместо структуры timeval.

struct timespec {

time_t tv_sec; /* секунды */

long tv_nsec; /* наносекунды */

};

Эти структуры отличаются вторыми элементами: элемент tv_nsecновой структуры задает наносекунды, в то время как элемент tv_usecпрежней структуры задает микросекунды.

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

В отношении второго пункта рассмотрим следующий пример (описанный на с. 308–309 [110]). Обработчик сигнала нашей программы для сигнала SIGINTпросто устанавливает глобальную переменную intr_flagи возвращает управление. Если наш процесс блокирован в вызове функции select, возвращение из обработчика сигнала заставляет функцию завершить работу, присвоив errnoзначение EINTR. Код вызова selectвыглядит следующим образом:

if (intr_flag)

handle_intr(); /* обработка этого сигнала */

if ((nready = select(...)) < 0) {

if (errno == EINTR) {

if (intr_flag)

handle_intr();

}

...

}

Проблема заключается в том, что если сигнал придет в промежутке между проверкой переменной intr_flagи вызовом функции select, он будет потерян в том случае, если функция selectзаблокирует процесс навсегда. С помощью функции pselectмы можем переписать этот пример так, чтобы он работал более надежно:

sigset_t newmask, oldmask, zeromask;

sigemptyset(&zeromask);

sigemptyset(&newmask);

sigaddset(&newmask, SIGINT);

sigprocmask(SIG_BLOCK, &newmask, &oldmask); /* блокирование сигнала SIGINT */

if (intr_flag)

handle_intr(); /* обработка этого сигнала */

if ((nready = pselect(..., &zeromask)) < 0) {

if (errno == EINTR) {

if (intr_flag)

handle_intr();

}

...

}

Перед проверкой переменной intr_flagмы блокируем сигнал SIGINT. Когда вызывается функция pselect, она заменяет маску сигналов процесса пустым набором ( zeromask), а затем проверяет дескрипторы, возможно, переходя в состояние ожидания. Но когда функция pselectвозвращает управление, маске сигналов процесса присваивается то значение, которое предшествовало вызову функции pselect(то есть сигнал SIGINTблокируется).

Мы поговорим о функции pselectболее подробно и приведем ее пример в разделе 20.5. Функцию pselectмы используем в листинге 20.3, а в листинге 20.4 показываем простую, хотя и не вполне корректную реализацию этой функции.

ПРИМЕЧАНИЕ

Есть одно незначительное различие между функциями select и pselect. Первый элемент структуры timeval является целым числом типа long со знаком, в то время как первый элемент структуры timspec имеет тип time_t. Число типа long со знаком в первой функции также должно было относиться к типу time_t, но мы не меняли его тип, чтобы не разрушать существующего кода. Однако в новой функции это можно было бы сделать.

6.10. Функция poll

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

#include

int poll(struct pollfd * fdarray , unsigned long nfds , int timeout );

Возвращает: количество готовых дескрипторов, 0 в случае тайм-аута, -1 в случае ошибки

Первый аргумент — это указатель на первый элемент массива структур. Каждый элемент массива — это структура pollfd, задающая условия, проверяемые для данного дескриптора fd.

struct pollfd {

int fd; /* дескриптор, который нужно проверить */

short events; /* события на дескрипторе, которые нас интересуют */

short revents; /* события, произошедшие на дескрипторе fd */

};

Проверяемые условия задаются элементом events, и состояние этого дескриптора функция возвращает в соответствующем элементе revents. (Наличие двух переменных для каждого дескриптора, одна из которых — значение, а вторая — результат, дает возможность обойтись без аргументов типа «значение-результат». Вспомните, что три средних аргумента функции selectимеют тип «значение-результат».) Каждый из двух элементов состоит из одного или более битов, задающих определенное условие. В табл. 6.2 перечислены константы, используемые для задания флага eventsи для проверки флага revents.

Таблица 6.2. Различные значения флагов events и revents для функции poll

Константа На входе (events) На выходе (revents) Описание
POLLIN Можно считывать обычные или приоритетные данные
POLLRDNORM Можно считывать обычные данные
POLLRDBAND Можно считывать приоритетные данные
POLLPRI Можно считывать данные с высоким приоритетом
POLLOUT Можно записывать обычные данные
POLLWRNORM Можно записывать обычные данные
POLLWRBAND Можно записывать приоритетные данные
POLLERR Произошла ошибка
POLLHUP Произошел разрыв соединения
POLLNVAL Дескриптор не соответствует открытому файлу

Мы разделили эту таблицу на три части: первые четыре константы относятся ко вводу, следующие три — к выводу, а последние три — к ошибкам. Обратите внимание, что последние три константы не могут устанавливаться в элементе events, но всегда возвращаются в revents, когда выполняется соответствующее условие.

Существует три класса данных, различаемых функцией poll: обычные , приоритетные и данные с высоким приоритетом . Эти термины берут начало в реализациях, основанных на потоках (см. рис. 31.5).

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Уильям Стивенс читать все книги автора по порядку

Уильям Стивенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




UNIX: разработка сетевых приложений отзывы


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


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x