Ответ 1
От http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
Вот шаги, чтобы стать демонами:
- fork(), чтобы родительский элемент мог выйти, он возвращает элемент управления в командную строку или оболочку, вызывающую вашу программу. Этот шаг необходим, чтобы гарантировать, что новый процесс не будет лидером группы процессов. Следующий шаг, setsid(), терпит неудачу, если вы являетесь лидером группы процессов.
- setsid(), чтобы стать группой процессов и лидером группы сеансов. Поскольку управляющий терминал связан с сеансом, и этот новый сеанс еще не приобрел контрольный терминал, наш процесс теперь не имеет управляющего терминала, который является хорошим типом для демонов.
- fork() снова, чтобы родительский (лидер группы сеансов) мог выйти. Это означает, что мы, как лидер несетевой группы, никогда не сможем восстановить контрольный терминал.
- chdir ( "/" ), чтобы гарантировать, что наш процесс не будет использовать какой-либо каталог. Невозможность сделать это может привести к тому, что администратор не сможет отключить файловую систему, потому что это был наш текущий каталог. [Эквивалентно, мы могли бы перейти на любой каталог, содержащий файлы, важные для операции демона.]
- umask (0), чтобы мы имели полный контроль над разрешениями всего, что мы пишем. Мы не знаем, что umask мы могли унаследовать. [Этот шаг не является обязательным]
- close() fds 0, 1 и 2. Это освобождает стандартную входную, выходную и ошибку, которые мы унаследовали от нашего родительского процесса. У нас нет способа узнать, куда эти фоны могли быть перенаправлены. Обратите внимание, что многие демоны используют sysconf() для определения предела _SC_OPEN_MAX. _SC_OPEN_MAX сообщает вам максимальные открытые файлы/процесс. Затем в цикле демон может закрыть все возможные файловые дескрипторы. Вы должны решить, нужно ли вам это делать или нет. Если вы считаете, что файловые дескрипторы могут открываться, вы должны закрыть их, так как существует ограничение на количество одновременных дескрипторов файлов.
- Установите новые открытые дескрипторы для stdin, stdout и stderr. Даже если вы не планируете использовать их, все же рекомендуется открыть их. Точное обращение с ними - дело вкуса; если у вас есть файл журнала, например, вы можете открыть его как stdout или stderr и открыть '/dev/null' как stdin; альтернативно, вы можете открыть '/dev/console' как stderr и/или stdout, а '/dev/null' в качестве stdin или любую другую комбинацию, которая имеет смысл для вашего конкретного демона.
Еще лучше, просто вызовите функцию daemon(), если она доступна.