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