Строки 53-56. Подпрограмма cleanup_child (). Эта подпрограмма вызывается обработчиком chld модуля Daemon, вызов которого происходит после удаления из системных таблиц информации о завершившемся дочернем процессе; следовательно, подпрограмма вызывается во время обработки прерывания.
Выполняется выборка PID дочернего процесса, переданного модулем Daemon, но в данной версии сервера с этой информацией не выполняется каких-либо действий. Происходит только уменьшение переменной на единицу, что будет служить для главного цикла сигналом об уничтожении одного дочернего процесса.
Если в вашей системе применяются версии процедур ps или top, которые вызывают системный вызов, выполняемый каждым процессом, то с их помощью можно заметить разницу между версиями сервера, в которых используются неупорядоченные и упорядоченные вызовы функции accept ( ). В системе Linux утилита top после вызова неупорядоченной версии сервера показала следующее:
PID SIZE WCHAN STAT. %CPU %MEM TIME COMMAND :
15300 2560 tcp_parse S 0.0 4.0 0:00 web_preforkl.pl 15301 2560 tcp_parse S 0.0 4.0 0:00 web_preforkl.pl 15302 2560 tcp_parse S 0.0 4.0 0:00 web_preforkl.pl 15303 2560 tcp_parse S 0.0 4.0 0:00 web_preforkl.pl 15304 2560 tcp_parse S 0.0 4.0 0:00 web_preforkl.pl
Здесь — пять дочерних процессов, и для каждого из них (как показано в столбце WCHAN) выполняется системный вызов tcp_parse. Вероятно, эта процедура вызывается функцией accept () во время ожидания входящего соединения.
PID 1
SIZE
WCHAN
STAT
%CPU
%MEM
TIME
15313
2984
pause
S
0.0
4.6
0
00
15314
2980
flock
lock
S
0.0
4.6
0
00
15315
2980
tcp parse
S
0.0
4.6
0
00
15316
2980
flock
lock
S
0.0
4.6
0
00
15317
2980
flock
lock
S
0.0
4.6
0
00
15318
2980
flock
lock
S
0.0
4.6
0
00
В отличие от этого, последняя версия сервера с предварительным ветвлением обнаруживает совсем иную картину. Процесс, находящийся в верхней части списка (PID 15313), является родительским. Утилита top указывает для него значение pause, поскольку в функции sleep () применяется именно этот системный вызов. Остальные пять процессов (15314- 15318) — дочерние. Только один из них выполняет функцию accept (), а другие заблокированы в системном вызове flock_lock. После того как активный дочерний процесс обработает входящее соединение, его место займет другой, но в любой момент времени функцию accept ( ) вызывает только один дочерний процесс.