daemon(3) выполнение в фоновом режиме

ОБЗОР

#include <unistd.h>

int daemon(int nochdir, int noclose);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

daemon(): _BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)

ОПИСАНИЕ

Функция daemon() необходима для того, чтобы отключить программу от управляющего терминала и запустить её в фоновом режиме подобно тому, как выполняются системные службы.

Если аргумент nochdir равен нулю, то daemon() изменяет текущий рабочий каталог процесса на корневой («/»); в противном случае текущий рабочий каталог не изменяется.

Если аргумент noclose равен нулю, то daemon() перенаправляет стандартный поток ввода, вывода и ошибок в /dev/null; в противном случае данные файловые дескрипторы не изменяется.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Эта функция порождает новый процесс и, если fork(2) завершается без ошибок, родительский процесс вызывает _exit(2), чтобы дальнейшие ошибки воспринимались только дочерним процессом. В случае успешного выполнения daemon() возвращается ноль. Если возникла ошибка, то daemon() возвращает -1 и присваивает глобальной переменной errno одно из значений, указанных для fork(2) и setsid(2).

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).
ИнтерфейсАтрибутЗначение
daemon() безвредность в нитяхбезвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

Отсутствует в POSIX.1. Подобная функция есть в BSD. Впервые функция daemon() появилась в 4.4BSD.

ЗАМЕЧАНИЯ

Реализация в glibc может также возвращать -1 в случаях, когда /dev/null существует, но не является файлом символьного устройства с ожидаемыми основным и вспомогательным номерами. В этом случае нет необходимости устанавливать errno.

ДЕФЕКТЫ

Для библиотеки GNU C реализация этой функции была взята из BSD, и в ней не применяется техника двойного fork (т. е., fork(2), setsid(2), fork(2)), поэтому необходимо проверить, что полученный процесс службы не является лидером сеанса. Вместо этого полученная служба является лидером сеанса. В системах, следующих семантике System V (например, Linux), это означает, что если служба открывает терминал, которой пока не является управляющим для другого сеанса, то этот терминал непреднамеренно станет управляющим терминалом для службы.