Программирование сервера с учетом необходимости ожидания завершения работы каждого дочернего процесса

Как было описано выше, после ветвления серверного процесса и завершения родительского, дочерний процесс приобретает в качестве родительского начальный процесс системы init. Поскольку в процессе init повторно вызывается функция wait, все его дочерние процессы завершают свою работу корректно. Поэтому по окончании работы ведущего сервера не возникает никаких проблем.

Однако процессы, вызванные на выполнение ведущим сервером, становятся дочерними процессами именно его, а не начального процесса init. Поэтому любой сервер, в котором создаются процессы, должен вызывать функцию wait после завершения работы дочерних процессов. В главе 11 приведен код, который показывает, как можно обеспечить ожидание завершения работы дочерних процессов с помощью функции wait. В нем показано, что сервер получает сигнал о завершении каждого дочернего процесса, поэтому в обработчике этого сигнала может находиться код для вызова функции wait.

30.22. Посторонние сигналы

Даже после того как сервер отключается от управляющего терминала, он по-прежнему может получать сигналы. В частности, передать сигнал серверу может любой системный администратор или привилегированный процесс. Чаще всего, администратор посылает сигнал SIGKILL (сигнал 9) для останова сервера. В процессе проектирования сервера может быть также предусмотрено использование одного или нескольких сигналов для управления его работой. Например, может быть учтена возможность повторной инициализации сервера после получения им сигнала HANGUP (сигнал 1).

30.23. Программирование сервера с учетом предотвращения воздействия посторонних сигналов

В большинстве производственных серверов предусмотрено, что они должны игнорировать все сигналы кроме тех из них, которые применяются для управления сервером. Для этого в сервере вызывается либо системная функция signal, либо системная функция sigvec. Например, чтобы игнорировался сигнал HANGUP, в сервере выполняется следующий оператор:

(void)signal(SIG_IGN,SIGHUP); 

В качестве особого случая отметим, что если в процессе Р будет задана опция SIG_IGN для игнорирования сигнала SIG__CHLD, то операционная система не будет создавать процессов зомби после завершения работы дочерних процессов процесса Р.

Похожие статьи Меню Опрос Фото Популярное
rss