UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Листинг 5.5. Функция signal, вызывающая функцию POSIX sigaction
//lib/signal.c 1 #include "unp.h" 2 Sigfunc* 3 signal(int signo, Sigfunc *func) 4 { 5 struct sigaction act, oact; 6 act.sa_handler = func; 7 sigemptyset(&act.sa_mask); 8 act.sa_flags = 0; 9 if (signo == SIGALRM) {10 #ifdef SA_INTERRUPT11 act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */12 #endif13 } else {14 #ifdef SA_RESTART15 act.sa_flags |= SA_RESTART; /* SVR4, 44BSD */16 #endif17 }18 if (sigaction(signo, &act, &oact) < 0)19 return (SIG_ERR);20 return (oact.sa_handler);21 }2-3signalvoid (*signal(int <i>signo</i>, void (*<i>func</i>)(int)))(int);Чтобы упростить эту запись, мы определяем тип
Sigfuncunp.htypedef void Sigfunc(int);указывая тем самым, что обработчики сигналов — это функции с целочисленным аргументом, ничего не возвращающие (
voidSigfunc *signal(int <i>signo</i>, Sigfunc *<i>func</i>);Указатель на функцию, являющуюся обработчиком сигнала, — это второй аргумент функции и в то же время возвращаемое функцией значение.
6sa_handlersigactionfuncsignal7sa_mask8-17SA_RESTARTSIGALRMSA_RESTARTSIGALRMSA_INTERRUPTSIGALRM18-20sigactionsignalВ книге мы везде используем функцию
signalСемантика сигналов POSIX
Сведем воедино следующие моменты, относящиеся к обработке сигналов в системе, совместимой с POSIX.
■ Однажды установленный обработчик сигналов остается установленным (в более ранних системах обработчик сигналов удалялся каждый раз по выполнении).
■ На время выполнения функции — обработчика сигнала доставляемый сигнал блокируется. Более того, любые дополнительные сигналы, заданные в наборе сигналов
sa_masksigactionsa_mask■ Если сигнал генерируется один или несколько раз, пока он блокирован, то обычно после разблокирования он доставляется только один раз, то есть по умолчанию сигналы Unix не устанавливаются в очередь. Пример мы рассмотрим в следующем разделе. Стандарт POSIX реального времени 1003.1b определяет набор надежных сигналов, которые помещаются в очередь, но в этой книге мы их не используем.
■ Существует возможность выборочного блокирования и разблокирования набора сигналов с помощью функции
sigprocmask5.9. Обработка сигнала SIGCHLD
Назначение состояния зомби — сохранить информацию о дочернем процессе, чтобы родительский процесс мог ее впоследствии получить. Эта информация включает идентификатор дочернего процесса, статус завершения и данные об использовании ресурсов (время процессора, память и т.д.). Если у завершающегося процесса есть дочерний процесс в зомбированном состоянии, идентификатору родительского процесса всех зомбированных дочерних процессов присваивается значение 1 (процесс
initinitwaitCOMMAND<defunct>Обработка зомбированных процессов
Очевидно, что нам не хотелось бы оставлять процессы в виде зомби. Они занимают место в ядре, и в конце концов у нас может не остаться идентификаторов для нормальных процессов. Когда мы выполняем функцию
forkwaitSIGCHLDwaitwaitwaitpid
