Какая разница между вызовом 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() - концепция высокого уровня, это определенно предпочтительнее для начинающих и опытных программистов.