Читаем Linux API. Исчерпывающее руководство полностью

Флаги. Данное поле может содержать либо wait, либо nowait. Оно указывает, будет ли сокет службы управляться (временно) самим сервером, запущенным с помощью inetd. Если ответ положительный, то значение должно быть равно wait. Это заставит inetd удалить свой файловый дескриптор для данного сокета из набора, отслеживаемого путем вызова select(). Демон inetd не будет иметь доступа к сокету, пока сервер не завершит свою работу (это определяется благодаря обработчику для сигнала SIGCHLD). Мы еще вернемся к данному полю чуть ниже.

Имя пользователя. Это поле содержит имя пользователя из файла /etc/passwd; за ним через точку (.) может быть указано название группы, заданное в файле /etc/group. Так определяются групповые и пользовательские идентификаторы, которые будут применены к запускаемому серверу (демон inetd выполняется с помощью действующего идентификатора администратора, поэтому его потомки тоже наделены повышенными привилегиями; так что, если им нужно изменить учетные данные своих процессов, они должны задействовать вызовы setuid() и setgid()).

Серверная программа. В данном поле указывается путь к серверной программе, которую нужно запустить.

Аргументы серверной программы. В этом поле содержится один или несколько аргументов, разделенных пробельными символами, которые будут указаны при запуске серверной программы. Первый из них соответствует argv[0] и обычно обозначает имя исполняемого файла. Следующий аргумент соответствует argv[1] и т. д.

В строчках для служб ftp, telnet и login, приведенных в листинге 56.5, можно видеть, что серверные программы и их аргументы указаны не совсем так, как это описано выше. Во всех трех случаях изначально вызывается одна и та же программа, tcpd(8) (обертка для TCP-демона). Прежде чем запустить соответствующий сервер, она выполняет учет данных и проверку прав доступа. Исполняемый файл определяется на основе значения, заданного в качестве первого аргумента (который доступен для tcpd в виде элемента argv[0]). Дальнейшие подробности о tcpd можно найти на странице tcpd(8) руководства и в книге [Mann & Mitchell, 2003].

Серверы на основе потоковых сокетов (TCP), запущенные с помощью inetd, обычно обрабатывают единственное соединение, после чего завершаются, давая inetd возможность наблюдать за дальнейшими подключениями. В поле с флагом для таких серверов должно быть указано значение nowait (если запускаемый сервер продолжает принимать соединения, то нужно указать wait; в этом случае inetd не станет отслеживать запросы и передаст серверу слушающий сокет в виде дескриптора под номером 0).

Для большинства 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

Пример: вызов TCP-службы echo с помощью inetd

Ранее мы отмечали, что inetd упрощает написание серверных программ, особенно работающих в параллельном режиме (обычно по TCP). Это достигается за счет выполнения следующих шагов во время запуска сервера.

1. С использованием вызовов socket(), bind() и listen() (для TCP-серверов) инициализируются все структуры, связанные с сокетом.

2. Выполняется вызов accept() для новых TCP-соединений.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных