Почему необходимо закрыть стандартный ввод / вывод / ошибку при написании демона? - PullRequest
4 голосов
/ 22 марта 2012

Почему необходимо закрыть стандартный ввод / вывод / ошибку при записи (unix) демона?

Ответы [ 2 ]

6 голосов
/ 22 марта 2012

Должны быть закрыты не только stdin, stdout и stderr, но и все открытые файлы.

Из "Расширенного программирования в среде UNIX", W. Richard Stevens, Addison-Weseley, 18th Printing, 1999, стр.417.

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

Mr.Предложение Стивенса состоит в том, чтобы получить максимальный дескриптор файла и закрыть все файлы до этого значения.

Цитируемая глава посвящена «Процессам демона».Обратите внимание, что при написании демонов закрывающие файловые дескрипторы - это только одна точка из пяти.

4 голосов
/ 22 марта 2012

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

Требуется закрытие стандартного ввода, чтобы демон (и / или дочерний элемент) не застревал, пытаясь прочитать какой-либо ввод от пользователя.

Но если вы собираетесь отсоединить своего демона от управляющего TTY с помощью setsid(), стандартный ввод / вывод / ошибка будет недействительным .

...