Суперсервер inetd Продолжение

Опубликовано в Технологии > Серверные технологии

После создания ведущего сокета суперсервер inetd регистрирует остальную информацию из файла конфигурации и ожидает поступления запроса из ведущего сокета. Если какой-то клиент обращается к одной из указанных служб, суперсервер inetd использует зарегистрированную информацию для определения своих дальнейших действий. Например, поле wait status с обозначением режима ожидания определяет, должен ли суперсервер inetd параллельно эксплуатировать сразу несколько копий программы поддержки службы. Если в файле конфигурации в этом поле указано значение nowait, то суперсервер inetd создает новый процесс для каждого поступающего запроса и обеспечивает параллельное выполнение таких процессов. Поскольку суперсервер inetd создает с помощью функции fork дочерний процесс, выполняющий программу службы, при получении каждого запроса создается новый процесс. Процесс inetd, который всегда находится в состоянии готовности, продолжает ожидать поступления запросов через ведущие сокеты. у нас практичный конвектор напольный для вас не скажем.

Вообще, значение wait поля wait status показывает, что суперсервер inetd должен обрабатывать запросы к данной службе последовательно (т.е. программа службы должна закончить обработку одного запроса, прежде чем суперсервер inetd запустит следующий процесс для выполнения этой программы). Однако отметим, что при поступлении первого запроса к службе, для которой указан режим ожидания wait, суперсервер inetd создает путем ветвления отдельный процесс для эксплуатации программы данного сервера. Чтобы понять, с чем это связано, необходимо отметить, что процесс inetd не может блокироваться, ожидая окончания работы какой-то службы, поскольку для других служб может потребоваться параллельное выполнение. Чтобы предотвратить запуск нескольких процессов с режимом ожидания wait, в суперсервере inetd просто применяется следующий принцип: не принимать дальнейшие запросы к этой службе до тех пор, пока ее сервер не закончит свою работу; после запуска процесса для конкретной службы суперсервер inetd использует значение поля wait status для определения способа дальнейших действий. Если в этом поле указано значение wait, суперсервер inetd удаляет ведущий сокет этой службы из набора сокетов, через которые он принимает запросы на установление соединения. После завершения процесса, поддерживающего данную службу, суперсервер inetd снова добавляет сокет к набору активных сокетов и переходит в состояние ожидания запроса к этой службе.

Хотя поле wait status подчеркивает концептуальное различие между последовательным и параллельным выполнением, часто целесообразно выбрать для него значение wait по практическим соображениям. В частности, в службах UDP значение wait используется для служб, которые предусматривают обмен между клиентом и сервером многочисленными дейтаграммами. Такое значение поля wait status исключает возможность использования суперсервером inetd этого сокета до тех пор, пока программа службы, не закончит свою работу. Таким образом, клиент может передавать свои дейтаграммы программе службы без посторонних помех. Как только программа службы завершит свою работу, суперсервер inetd снова приступает к использованию этого сокета.

При любом из этих двух указанных режимов ожидания суперсервер inetd использует поле server program в файле конфигурации для определения того, какая программа службы должна быть вызвана на выполнение. Если в этом поле содержится значение internal, суперсервер inetd вызывает для поддержки этой службы внутреннюю процедуру4. В ином случае, суперсервер inetd воспринимает эту строку как имя файла, который должен быть вызван на выполнение. При вызове программы сервера суперсервер inetd передает ей содержимое поля параметров arguments.