Подтвердить что ты не робот

Почему ДОЛЖЕН отсоединиться от tty при написании демона linux?

Когда я попытался написать демона под 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);

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Еще один ответ: "Нет, не пишите код, который демононирует себя".

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

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

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

(В самом деле, я бы сказал, что существует долгосрочный риск при написании программ самоопределения. Бойлерные "фоновые" подпрограммы копируются и вставляются и быстро переносятся и расширяются, а программист тратит время на вспомогательный код, а не на программу основная цель.)