я пытаюсь понять, как я могу сделать мою программу демоном. Я столкнулся с некоторыми вещами, с которыми я столкнулся. В общем, программа выполняет следующие шаги, чтобы стать демоном:
fork ()
. В родительском элементе вызовите exit ()
. Это гарантирует, что исходный родитель (демон
Я пытаюсь понять, как я могу сделать свою программу демоном. Вот некоторые вещи, с которыми я столкнулся. В общем, программа выполняет следующие шаги, чтобы стать демоном:
fork ()
. В родительском элементе вызовите exit ()
. Это гарантирует, что исходный родитель (демон
Я пытаюсь понять, как я могу сделать свою программу демоном. Вот некоторые вещи, с которыми я столкнулся. В общем, программа выполняет следующие шаги, чтобы стать демоном:
fork ()
. В родительском элементе вызовите exit ()
. Это гарантирует, что исходный родитель (демон
дедушка и бабушка) удовлетворен тем, что его дочерний элемент завершен, а родитель демона не
дольше работает, и что демон не является лидером группы процессов. Этот последний пункт
является требованием для успешного завершения следующего шага.
Вызов setsid ()
, давая демону новую группу процессов и сеанс, оба из
у которых он как лидер. Это также гарантирует, что процесс не связан
управляющий терминал (поскольку процесс только что создал новую сессию и не будет назначать
one).
Измените рабочий каталог на корневой с помощью chdir ()
. Готово
потому что унаследованный рабочий каталог может находиться в любом месте файловой системы.
Демоны, как правило, работают на время безотказной работы системы, а вы не хотите
чтобы оставить случайный каталог открытым и, таким образом, предотвратить доступ администратора
размонтирование файловой системы, содержащей этот каталог.
Закройте все файловые дескрипторы.
/ 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, чтобы я мог понять этот процесс более глубоко.