Кроме того, можно видеть сообщения дочерних процессов, выводимые при каждом вызове функции accept () или во время завершения. Таковые могут появляться, например, при запросе к странице, представляющей аксессуары для машины из Кореи . Обратите внимание на то, как было выполнено уничтожение родительским процессом дочернего процесса, после того как число простаивающих дочерних процессов превысило верхнюю отметку.
В представленной здесь программе есть потенциальная ошибка в коде реализации родительского процесса. Родительский процесс читает из дескриптора CHILD_READ данные в виде фрагментов, максимальная длина которых составляет 4096 байт, а не в виде строк. Если дочерние процессы работают очень активно, а родительский процесс реагирует очень медленно, то в дескрипторе может на- копиться много сообщений, объем которых превышает 4096 байт, и последнее будет разбито на части, которые будут считаны в два этапа. Хотя это маловероятно (если средняя длина сообщений составляет 10 байт, то в объеме 4096 байт может поместиться 400 сообщений), может быть предусмотрена возможность буферизации считанных данных в строковой переменной и явной проверки на наличие результатов частичного чтения, которые не оканчиваются символами конца строки.
Адаптивный сервер с предварительным ветвлением, использующий разделяемую память
И наконец, рассмотрим тот же сервер, реализованный с использованием разделяемой памяти. Все современные версии UNIX обеспечивают доступ к разделяемой памяти, что позволяет нескольким процессам выполнять чтение и запись в одном и том же сегменте памяти.