UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
33 Signal(SIGHUP, sig_hup);34 Signal(SIGIO, sig_io);35 Fcntl(sockfd, F_SETOWN, getpid());36 Ioctl(sockfd, FIOASYNC, &on);37 Ioctl(sockfd. FIONBIO, &on);38 Sigemptyset(&zeromask); /* инициализация трех наборов сигналов */39 Sigemptyset(&oldmask);40 Sigemptyset(&newmask);41 Sigaddset(&newmask, SIGIO); /* сигнал, который хотим блокировать*/42 Sigprocmask(SIG_BLOCK, &newmask, &oldmask);43 for (;;) {44 while (nqueue == 0)45 sigsuspend(&zeromask); /* ждем дейтаграмму для обработки */46 /* разблокирование SIGIO */47 Sigprocmask(SIG_SETMASK, &oldmask, NULL);48 Sendto(sockfd, dg[iget].dg_data, dg[iget].dg_len, 0,49 dg[iget].dg_sa, dg[iget].dg_salen);50 if (++iget >= QSIZE)51 iget = 0;52 /* блокировка SIGIO */53 Sigprocmask(SIG_BLOCK, &newmask, &oldmask);54 nqueue--;55 }56 }27-3233-37SIGHUPSIGIOfcntlioctlРанее отмечалось, что для разрешения ввода-вывода, управляемого сигналом, в POSIX применяется флаг O_ASYNC функции fcntl, но поскольку большинство систем пока его не поддерживают, мы используем функцию ioctl. Поскольку большинство систем не поддерживают флаг O_NONBLOCK для включения неблокируемого ввода-вывода, здесь также рассмотрен вариант использования функции ioctl.
38-41zeromaskoldmaskSIGIOnewmasksigaddsetnewmaskSIGIO42-45sigprocmaskoldmasknewmaskSIGIOfornqueuesigsuspendzeromaskzeromasksigsuspendEINTRsigsuspendnewmasksigsuspendSIGIOnqueueSIGIOА что произойдет, если сигнал SIGIO не будет блокирован во время проверки переменной nqueue, используемой совместно основным циклом и обработчиком сигналов? Может случиться так, что проверка nqueue покажет нулевое значение, а сразу после проверки возникнет сигнал и nqueue станет равна 1. Далее мы вызовем функцию sigsuspend и перейдем в режим ожидания, в результате чего пропустим сигнал. После вызова функции sigsuspend мы не выйдем из режима ожидания, пока не поступит другой сигнал. Это похоже на ситуацию гонок, описанную в разделе 20.5
46-51sigprocmaskoldmasksendtoigetSIGIOiget52-54SIGIOnqueueSIGIOnqueue
