Как работает DAEMON (3)? Запуск в фоновом режиме

Что такое шаг, чтобы сделать процесс отсоединенным от терминала? Для этого я нашел man-страницу daemon() В описании они упомянули

Если nochdir равно нулю, daemon () изменяет текущий рабочий каталог процесса в корневой каталог («/»); в противном случае текущий рабочий каталог не изменяется.

Если noclose равен нулю, daemon () перенаправляет стандартный ввод, стандартный вывод и стандартную ошибку в / dev / null; в противном случае в эти файловые дескрипторы не вносятся изменения.

На самом деле, я пытался сделать мой код python запущенным как демон. Здесь я нашел код tcollector . В этом коде также выполняются те же шаги, что и в описании daemon() . Поэтому мой вопрос: зачем нам делать эти шаги (wrt daemonize() в tcollector ), как

зачем менять dir на / , umask на 022 а затем называть os.setsid() и т. д.

Там на самом деле больше, чем то, что вы цитировали, но я думаю, что справочная страница может быть более четкой.

Если nochdir равен нулю, daemon() изменяет текущий рабочий каталог процесса в корневой каталог ( / )

Предполагается, что программа запускается из командной строки администраторов, и идея состоит в том, чтобы отключить демона от того, что администратор делал в то время. Изменение рабочего каталога на / запрещает демонам сохранять точку подключения занятой. Например, если рабочий каталог был /home/admin и некоторое время спустя вы хотели размонтировать /home , демон предотвратил бы это.

Если noclose равен нулю, daemon() перенаправляет стандартный ввод, стандартный вывод и стандартную ошибку в /dev/null ;

Это должно помешать демонам запутать пользователей, написав сообщения об ошибках и т. Д. На их терминал. Вероятно, что должен сделать демон, нужно открыть некоторый (сконфигурированный) файл журнала и написать там все, что он хочет связывать с внешним.

(Эта функция вилки, и если fork (2) завершается успешно, родитель вызывает _exit (2), так что дальнейшие ошибки видны только ребенку.)

Опять же, чтобы отключиться от сеанса оболочки админов, основная программа немедленно возвращается, а другая часть остается в фоновом режиме, поэтому нет необходимости явно запрашивать ./daemon & программы в фоновом режиме (например ./daemon & )

Теперь, что на странице руководства явно не указано, но подразумевается здесь (под BUGS):

Реализация этой функции библиотеки GNU C была взята из BSD и не использует метод double-fork (т. Е. Fork (2), setsid (2), fork (2)), который необходим для обеспечения того, чтобы полученный процесс демон не является лидером сессии. Вместо этого результирующий демон является лидером сеанса.

daemon() также вызывает setsid() чтобы освободиться от терминала управления сеансом и, следовательно, от сигналов, отправленных терминалом. Но, как говорится в цитате, это оставляет возможность, что если он откроет терминальное устройство, он может случайно получить это вместо контрольного терминала. Чтобы избежать этого, некоторые программы вызывают fork() , затем setsid() из дочернего setsid() , а затем снова вилка, выходя из обоих родителей, так что результирующий процесс не является лидером сеанса (средний является / был) и не может получить управляющий терминал. Программа Python, на которую вы ссылаетесь, делает именно это.

Изменение umask , похоже, не связано с демонамизацией. Возможно, эта программа имеет для этого особую потребность.