UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
#include <pthread.h>int pthread_cond_broadcast(pthread_cond_t *<i>cptr</i>);int pthread_cond_timedwait(pthread_cond_t *<i>cptr</i>, pthread_mutex_t *<i>mptr</i>, const struct timespec *<i>abstime</i>);<i>Обе функции возвращают: 0 в случае успешного выполнения, положительное значение Exxx в случае ошибки</i>Функция
pthread_cond_timedwaitabstimetimespecpselectETIMEВ данном случае значение времени является абсолютным значением времени, в отличие от относительного значения разницы во времени (time delta) между некоторыми событиями. Иными словами,
abstimepselectselectpselectgettimeofdaytimevaltimespecstruct timeval tv;struct timespec ts;if (gettimeofday(&tv, NULL) < 0) err_sys("gettimeofday error");ts.tv_sec = tv.tv_sec + 5; /* 5 с в будущем */ts.tv_nsec = tv.tv_usec * 1000; /* микросекунды переводим в наносекунды */pthread_cond_timedwait( , &ts);Преимущество использования абсолютного времени (в противоположность относительному) заключается в том, что функция может завершиться раньше (возможно, из-за перехваченного сигнала). Тогда функцию можно вызвать снова, не меняя содержимое структуры
timespecgettimeofdaypthread_cond_timedwaitВ POSIX определена новая функция clock_gettime, возвращающая текущее время в виде структуры timespec.
26.9. Веб-клиент и одновременный доступ
Изменим код нашего веб-клиента из раздела 26.6: уберем вызов функции Solaris
thr_joinpthread_joinЕдинственным изменением в отношении глобальных переменных (см. листинг 26.7) является добавление нового флага и условной переменной:
#define F_JOINED 8 /* количество потоков */int ndone; /* количество завершившихся потоков */pthread_mutex_t ndone_mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t ndone_cond = PTHREAD_COND_IINITIALIZER;Единственным изменением функции
do_get_readndone printf("end-of-file on %sn", fptr->f_name); Close(fd); Pthread_mutex_lock(&ndone_mutex); fptr->f_flags = F_DONE; /* сбрасывает флаг F_READING */ ndone++; Pthread_cond_signal(&ndone_cond); Pthread_mutex_unlock(&ndone_mutex); return(fptr); /* завершение выполнения потока */}Большинство изменений касается главного цикла, представленного в листинге 26.8. Новая версия показана в листинге 26.13.
Листинг 26.13. Основной рабочий цикл функции main
//threads/web03.c43 while (nlefttoread > 0) {44 while (nconn < maxnconn && nlefttoconn > 0) {45 /* находим файл для считывания */46 for (i = 0; i < nfiles; i++)47 if (file[i].f_flags == 0)48 break;49 if (i == nfiles)50 err_quit("nlefttoconn = %d but nothing found", nlefttoconn);51 file[i].f_flags = F_CONNECTING;52 Pthread_create(&tid, NULL, &do_get_read, &file[i]);53 file[i].f_tid = tid;54 nconn++;55 nlefttoconn--;56 }57 /* Ждем завершения выполнения одного из потоков */58 Pthread_mutex_lock(&ndone_mutex);59 while (ndone == 0)60 Pthread_cond_wait(&ndone_cond, &ndone_mutex);61 for (i = 0; i < nfiles; i++) {62 if (file[i].f_flags & F_DONE) {
