Я пытаюсь понять, как сделать свою программу демоном. Так что некоторые вещи, с которыми я столкнулся, в общем, программа выполняет следующие шаги, чтобы стать демоном:
- Вызов
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 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, чтобы я мог понять этот процесс более подробно.