22.4. Запуск в качестве демона

22.4. Запуск в качестве демона

При разработке программ, создаваемых для работы в качестве системных демонов, нужно очень внимательно проводить их становление как демонов для правильного определения всех деталей. Ниже приведен перечень тех обстоятельств, на которые необходимо обратить внимание.

1. Большинство действий по инициализации должны быть произведены до того, как программа становится фактическим демоном. Это гарантирует, что пользователь при запуске не будет получать сообщения об ошибках, и будет возвращаться значащий код завершения. Этот вид деятельности включает в себя анализ конфигурационных файлов и открытие сокетов.

2. Текущий каталог должен быть изменен на какой-либо подходящий. Это может быть корневой каталог, но никогда не может быть тот каталог, из которого была запущена программа. Если демон этого не сделает, то, возможно, он будет работать соответствующим образом, но это не позволяет удалить тот каталог, из которого он был активизирован, поскольку он остается текущим каталогом программы. Если это возможно, то неплохо применить chroot() на какой-то каталог. Причины обсуждались ранее в этой главе.

3. Все ненужные файловые дескрипторы должны быть закрыты. Это может показаться очевидным, однако вы легко можете упустить закрытие тех дескрипторов, которые были унаследованы, а не открыты самой программой. Об этом речь шла в предыдущем разделе.

4. Затем программа должна вызвать fork(), а родительский процесс должен вызвать exit(), позволяя программе, запустившей демон (чаще всего командному процессору), продолжить работу.

5. Дочерний процесс, продолжающий работу, должен закрыть stdin, stdout и stderr, поскольку он не будет больше использовать терминал. Вместо повторного применения файловых дескрипторов 0, 1 и 2 лучше открывать эти файлы как /dev/null. Это гарантирует, что ни одна библиотечная функция, передающая отчеты о состоянии ошибок в stdout или stderr, не запишет эти ошибки в другие файлы, открытые демоном. При этом демон сможет запускать внешние программы, не беспокоясь об их выходных данных.

6. Для полного разъединения с терминалом, из которого был запущен демон, он должен вызвать setsid(), чтобы разместить его в собственной группе процесса. Это предотвращает получение сигналов при закрытии терминала, а также сигналов управления заданиями.

Библиотека С предлагает функцию daemon(), которая обрабатывает некоторые из перечисленных задач.

int daemon(int nochdir, in tnoclose);

Данная функция сразу осуществляет ветвление, и если оно прошло успешно, родительский процесс вызывает _exit() с кодом завершения 0. Затем дочерний процесс переходит в корневой каталог, если nochdir не является нулем, и перенаправляет stdin, stdout и stderr в /dev/null, если noclose не равен нулю. Перед возвратом в дочерний процесс она также вызывает setsid(). При этом унаследованные файловые дескрипторы все равно могут оставаться открытыми, поэтому в программах, использующих daemon(), необходимо следить за ними. Если возможно, в программе также нужно использовать chroot().

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

В качестве послесловия

Из книги Разгони свой сайт автора Мациевский Николай

В качестве послесловия Целью данной книги является показать важность (иногда по-настоящему критическую) клиентской оптимизации и осветить ключевые моменты и проблемные места. Очень хочется верить, что после прочтения книги у читателя сложилось целостное представление


5.2 Представления о качестве программного обеспечения

Из книги ИНФОРМАЦИОННАЯ ТЕХНОЛОГИЯ ОЦЕНКА ПРОГРАММНОЙ ПРОДУКЦИИ ХАРАКТЕРИСТИКИ КАЧЕСТВА И РУКОВОДСТВА ПО ИХ ПРИМЕНЕНИЮ автора Автор неизвестен

5.2 Представления о качестве программного обеспечения Имеется несколько представлений о качестве, некоторые из которых обсуждаются


Интерфейсы в качестве параметров

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Интерфейсы в качестве параметров Поскольку интерфейсы являются полноценными типами .NET, вы можете конструировать методы, которые будут использовать интерфейсы, как параметры. Для примера предположим, что мы определили другой интерфейс с именем IDraw3D.// Моделируем


Делегаты в качестве параметров

Из книги Фреймы для представления знаний автора Мински Марвин

Делегаты в качестве параметров Теперь, когда у нас есть новый тип делегата, который указывает на методы, получающие Car в виде параметра и не возвращающие ничего, мы можем создавать функции, которые принимают этот делегат в виде параметра. Для примера предположим, что у нас


3.8. Фреймы в качестве парадигм

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

3.8. Фреймы в качестве парадигм «До тех пор, пока не была создана эта парадигма схоластов (средневековая теория „первого толчка“), маятники как таковые не были известны людям, а ученые видели в них только качающиеся камни. Существование маятников было открыто благодаря


9.7. Запуск единственного экземпляра демона

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

9.7. Запуск единственного экземпляра демона Часто блокировки записей используются для обеспечения работы какой-либо пpoгрaммы (например, демона) в единственном экземпляре. Фрагмент кода, приведенный в листинге 9.8, должен выполняться при запуске демона.Листинг 9.8. Гарантия


8.2. Сопротивление в качестве параметра

Из книги Руководство по переходу на Ubuntu 10.04 LTS «Lucid Lynx» автора Неворотин Вадим

8.2. Сопротивление в качестве параметра При изучении урока 5 вам пришлось изрядно потрудиться, чтобы, «вручную» изменяя значение R в RC-фильтре нижних частот, получить диаграмму, изображенную на рис. 5.18. С помощью параметрического анализа вы сможете сделать это гораздо


8.3. Амплитуда напряжения в качестве параметра

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

8.3. Амплитуда напряжения в качестве параметра Еще раз внимательно посмотрите на окно Parametric, изображенное на рис. 8.11. Вверху слева вы видите список возможных изменяемых переменных для дополнительного анализа. К сожалению, этот список составлен не вполне корректно. Опции


8.5. Коэффициенты в качестве глобальных параметров

Из книги Как заработать на фотографии в Интернете автора Зьомко Ольга

8.5. Коэффициенты в качестве глобальных параметров До сих пор вы называли глобальными параметрами только значения компонентов, то есть сопротивление резисторов, индуктивность катушек и емкость конденсаторов. Однако за понятием «глобальный» кроется гораздо больше. Один


16.8 В качестве заключения

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

16.8 В качестве заключения В этой главе я постарался подробно рассказать об основных особенностях в работе с файлами в Ubuntu. Надеюсь, вы смогли разобраться что к чему и уловить основные моменты. Напоследок хочется заметить, что Ubuntu без какого-либо дополнительного


Выражения в качестве операндов

Из книги автора

Выражения в качестве операндов Операндом при увеличении или уменьшении значения TIMESTAMP, TIME, DATE или DATE в диалекте 1 может быть константа или выражение. Выражение может быть особенно полезным в ваших приложениях, когда вам надо увеличить или уменьшить значение в секундах,


Триггеры в качестве автоинкрементного механизма

Из книги автора

Триггеры в качестве автоинкрементного механизма Триггеры могут быть использованы в комбинации с генераторами для реализации автоинкрементных ключей. Подробные инструкции вы можете найти в главе


Глава 5 О качестве снимков

Из книги автора

Глава 5 О качестве снимков Пожалуй, разговор о качестве снимков можно считать краеугольным камнем темы продажи своих фотографий на микростоковых сайтах. Очень часто, когда люди, в целом далекие от искусства фотографии, слышат о том, что кто-то продает свои фотоснимки и


Пример: сервер времени и даты в качестве демона

Из книги автора

Пример: сервер времени и даты в качестве демона В листинге 13.2 представлено изменение нашего сервера времени и даты, не зависящего от протокола. В отличие от сервера, показанного в листинге 11.8, в нем вызывается функция daemon_init, чтобы этот сервер мог выполняться в качестве