Какая разница между вызовом daemon() и вызовом fork(), setsid(), fork() и т.д.?

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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