Другой ответ ясен и технически верен (и поэтому я проголосовал соответственно).
Другой ответ: «Нет, не пишите код, который демонизирует себя».
Вместо этого используйте среду контроля процесса (например, daemontools или runit или launchd ), которая позаботится об этом за вас.
Традиционный сервер UNIX самодемонизируется и поэтому объединяет многие вещи: текущий рабочий каталог, независимость группы процессов и сеансов, маски сигналов и расположение, корень файловой системы, привилегии, umask, дескрипторы открытых файлов и т. Д.
Однако большинство или все эти атрибуты процесса наследуются через exec()
, что означает, что процесс сервера обычно может быть «рожден» с нужной группой процессов, рабочим каталогом, корнем и т. Д.мало что нужно делать самому, хотя вам все равно придется самостоятельно управлять привилегированными операциями и отзывом привилегий.
(Действительно, я бы сказал,вот долгосрочный риск в написании само-демонизирующих программ.«Фоновые» подпрограммы Boilerplate копируются и вставляются, быстро переносятся и расширяются, и программист тратит время на вспомогательный код, а не на основное предназначение программы.)