我试图了解如何使我的程序成为守护程序,因此遇到的一些事情通常是程序执行以下步骤来成为守护程序:
- 致电
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)的现有源代码,以便我可以更深入地了解这一过程。