Почему ДОЛЖЕН отсоединяться от tty при написании демона linux? - PullRequest
24 голосов
/ 08 января 2012

Когда я пытался написать демон под linux, используя C, мне сказали, что я должен добавить следующий код после fork код блока:

/* Preparations */
...

/* Fork a new process */
pid_t cpid = fork();
if (cpid == -1){perror("fork");exit(1);}
if (cpid > 0){exit(0);}

/* WHY detach from tty ? */
int fd = open("/dev/tty", O_RDWR);
ioctl(fd, TIOCNOTTY, NULL);

/* Why set PGID as current PID ? */
setpgid(getpid(), 0);

Мой вопрос: Обязательно ли выполнять вышеуказанные операции?

Ответы [ 2 ]

42 голосов
/ 08 января 2012

Вы должны отсоединить свой процесс-демон от терминала, чтобы избежать отправки сигналов, связанных с работой терминала (например, SIGHUP, когда завершается сеанс терминала, а также потенциально SIGTTIN и SIGTTOU).

Обратите внимание, что способотсоединение от терминала с использованием TIOCNOTTY ioctl в значительной степени устарело.Вместо этого следует использовать setsid().

Причина, по которой демон покидает исходную группу процессов, заключается в том, что он не получает сигналы, отправленные этой группе.Обратите внимание, что setsid() также помещает ваш процесс в свою собственную группу процессов.

14 голосов
/ 08 января 2012

Другой ответ ясен и технически верен (и поэтому я проголосовал соответственно).

Другой ответ: «Нет, не пишите код, который демонизирует себя».

Вместо этого используйте среду контроля процесса (например, daemontools или runit или launchd ), которая позаботится об этом за вас.

Традиционный сервер UNIX самодемонизируется и поэтому объединяет многие вещи: текущий рабочий каталог, независимость группы процессов и сеансов, маски сигналов и расположение, корень файловой системы, привилегии, umask, дескрипторы открытых файлов и т. Д.

Однако большинство или все эти атрибуты процесса наследуются через exec(), что означает, что процесс сервера обычно может быть «рожден» с нужной группой процессов, рабочим каталогом, корнем и т. Д.мало что нужно делать самому, хотя вам все равно придется самостоятельно управлять привилегированными операциями и отзывом привилегий.

(Действительно, я бы сказал,вот долгосрочный риск в написании само-демонизирующих программ.«Фоновые» подпрограммы Boilerplate копируются и вставляются, быстро переносятся и расширяются, и программист тратит время на вспомогательный код, а не на основное предназначение программы.)

...