Я пытаюсь понять, как я могу сделать свою программу демоном. Итак, я столкнулся с некоторыми вещами, с которыми я столкнулся: В общем, программа выполняет следующие шаги, чтобы стать демоном:
- Позвоните
fork( ). В родительском вызове
exit( ). Это гарантирует, что исходный родительский элемент (прародитель демона) удовлетворен тем, что его дочерний элемент завершен, что родительский элемент демона больше не работает и что демон не является лидером группы процессов. Этот последний пункт необходим для успешного завершения следующего шага.Вызов
setsid( ), давая демону новую группу процессов и сеанс, в обоих из которых он является лидером. Это также гарантирует, что у процесса нет связанного управляющего терминала (поскольку процесс только что создал новый сеанс и не назначит его).Измените рабочий каталог на корневой с помощью
chdir( ). Это сделано потому, что унаследованный рабочий каталог может находиться где угодно в файловой системе. Демоны, как правило, работают на время безотказной работы системы, и вы не хотите, чтобы какой-то случайный каталог оставался открытым и, таким образом, не позволял администратору размонтировать файловую систему, содержащую этот каталог.Закройте все файловые дескрипторы.
- Откройте дескрипторы файлов 0, 1 и 2 (стандартный вход, стандартный выход и стандартная ошибка) и перенаправьте их на
/dev/null.
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>
int main (void)
{
pid_t pid;
int i;
/* create new process */
pid = fork ( );
if (pid == -1)
return -1;
else if (pid != 0)
exit (EXIT_SUCCESS);
/* create new session and process group */
if (setsid ( ) == -1)
return -1;
/* set the working directory to the root directory */
if (chdir ("/") == -1)
return -1;
/* close all open files--NR_OPEN is overkill, but works */
for (i = 0; i < NR_OPEN; i++)
close (i);
/* redirect fd's 0,1,2 to /dev/null */
open ("/dev/null", O_RDWR);
/* stdin */
dup (0);
/* stdout */
dup (0);
/* stderror */
/* do its daemon thing... */
return 0;
}
Может ли кто-нибудь дать мне ссылку на существующий исходный код какой-либо программы, такой как Apache, чтобы я мог понять этот процесс более глубоко.
daemon, я обычно передаю права некоторым пользователям и группам, используяsetgidиsetuid. Если вы хотите узнать, что делаетdaemon, я бы посмотрел в источник - person Jens Munk   schedule 22.05.2016