Как сделать демон процесса
Я пытаюсь понять, как сделать свою программу демоном. Так что некоторые вещи, с которыми я столкнулся, в общем, программа выполняет следующие шаги, чтобы стать демоном:
- Вызов
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, чтобы я мог понять этот процесс более подробно.
Ответы
Ответ 1
Если вы ищете чистый подход, рассмотрите возможность использования стандартного api- int daemon(int nochdir, int noclose);
. Персональная страница довольно проста и понятна. man. Хорошо протестированные api намного превосходят наши собственные интермедии реализации переносимости и стабильности.
Ответ 2
В Linux это легко сделать с помощью:
int main(int argc, char* argv[])
{
daemon(0,0);
while(1)
{
sleep(10)
/*do something*/
}
return 0;
}