В строчках для служб ftp, telnet и login, приведенных в листинге 56.5, можно видеть, что серверные программы и их аргументы указаны не совсем так, как это описано выше. Во всех трех случаях изначально вызывается одна и та же программа, tcpd(8) (обертка для TCP-демона). Прежде чем запустить соответствующий сервер, она выполняет учет данных и проверку прав доступа. Исполняемый файл определяется на основе значения, заданного в качестве первого аргумента (который доступен для tcpd в виде элемента argv[0]). Дальнейшие подробности о tcpd можно найти на странице tcpd(8) руководства и в книге [Mann & Mitchell, 2003].
Серверы на основе потоковых сокетов (TCP), запущенные с помощью inetd, обычно обрабатывают единственное соединение, после чего завершаются, давая inetd возможность наблюдать за дальнейшими подключениями. В поле с флагом для таких серверов должно быть указано значение nowait (если запускаемый сервер продолжает принимать соединения, то нужно указать wait; в этом случае inetd не станет отслеживать запросы и передаст серверу
Для большинства UDP-серверов поле с флагом должно быть равно wait. UDP-сервер, запущенный с помощью inetd, обычно считывает и обрабатывает все доступные для сокета датаграммы, после чего завершается. (Как правило, это требует применения времени ожидания при чтении из сокета, чтобы сервер мог завершиться, если за отведенный отрезок не поступило ни одной новой датаграммы.) Значение wait не дает демону inetd выполнить для сокета вызов select(), пока сервер работает, так как это может привести к нежелательным последствиям, например к соперничеству демона inetd и UDP-сервера за право проверить наличие датаграммы (и если первый выиграет, то ему придется запустить еще один экземпляр сервера).
Демон inetd и формат его конфигурационного файла не входят в стандарт SUSv3, поэтому набор допустимых значений для /etc/inetd.conf может варьироваться (обычно незначительно). Большинство версий inetd поддерживают как минимум тот синтаксис, который мы описали выше. Больше подробностей см. на странице inetd.conf(8) руководства.
Для лучшей эффективности inetd сам реализует несколько служб, чтобы не запускать отдельные серверы для выполнения ряда задач. Как пример можно привести службу echo, работающую по UDP и TCP. В таких случаях в качестве серверной программы в файле /etc/inetd.conf указывается значение internal, а соответствующие аргументы опускаются (в листинге 56.5 мы видели: строчки для службы echo закомментированы; для включения службы echo нужно убрать в начале этих строк символ #).
Чтобы демон inetd смог заново прочитать обновленную конфигурацию, при каждом изменении файла /etc/inetd.conf ему нужно отправлять сигнал SIGHUP:
# killall — HUP inetd
Ранее мы отмечали, что inetd упрощает написание серверных программ, особенно работающих в параллельном режиме (обычно по TCP). Это достигается за счет выполнения следующих шагов во время запуска сервера.
1. С использованием вызовов socket(), bind() и listen() (для TCP-серверов) инициализируются все структуры, связанные с сокетом.
2. Выполняется вызов accept() для новых TCP-соединений.