В чем разница между вызовом daemon () и вызовом fork (), setsid (), fork () и т. Д.? - PullRequest
11 голосов
/ 04 октября 2011

Я смотрел на создание Unix-демонов, и, кажется, есть два метода. Скучный, который, похоже, появляется при поиске, должен снова вызвать fork(), setsid(), fork(), chdir() в безопасное место, установить umask() и, наконец, close() stdin , stdout и stderr.

Запуск man daemon, однако, вызывает информацию о функции daemon(), которая, похоже, выполняет те же действия, что и выше. Есть ли различия между этими двумя подходами или daemon() - это просто удобная функция, которая выполняет те же функции, что и многословный метод? Или один из них лучше, особенно для начинающего программиста на С?

Ответы [ 3 ]

20 голосов
/ 04 октября 2011

Функция daemon не определена в POSIX, поэтому ее реализация (если таковая имеется) может вести себя по-разному на разных платформах.

В Linux с glibc daemon делает только один форк, необязательно chdir с (но только до /, вы не можете указать путь), не касается umask и не закрывает std* дескрипторы (хотя, по желанию, они снова открываются до /dev/null). (* 1 010 * источник )

Так что это зависит от платформы, и по крайней мере одна реализация делает меньше, чем вы. Если вам нужно все, что вы делаете, придерживайтесь этого (или придерживайтесь платформы, где функция daemon делает именно это).

2 голосов
/ 04 октября 2011

Обратите внимание, что daemon не соответствует ни одному стандарту. Лучше использовать стандартные соответствующие функции (например, определенные POSIX fork и setsid).

1 голос
/ 04 октября 2011

Вызов daemon суммирует длинную процедуру форка, и я не помню ни одной реализации, которая бы делала что-либо еще.

Поскольку daemon () является концепцией высокого уровня, она определенно предпочтительна для начинающих и опытных программистов.

...