我想了解如何让我的程序成为守护进程。所以我遇到的一些事情通常,程序会执行以下步骤来成为守护进程:
fork( )
。 在家长中,请致电exit( )
。这确保了原始父(守护进程)
祖父母)对孩子的终止感到满意,认为守护者的父母不是
运行时间更长,守护程序不是进程组负责人。最后一点
是成功完成下一步的要求。
调用setsid( )
,为守护程序提供一个新的进程组和会话
有它作为领导者。这也确保了该过程没有关联
控制终端(因为进程刚刚创建了一个新会话,并且不会分配
一个)。
通过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,这样我就可以更深入地理解这个过程了。
答案 0 :(得分:17)
如果您正在寻找干净的方法,请考虑使用标准的api int daemon(int nochdir, int noclose);
。手册页非常简单,自我解释。 man page。经过充分测试的api远远超过了我们自己实现的便携性和稳定性。
答案 1 :(得分:2)
在Linux中,可以使用以下方法轻松完成:
int main(int argc, char* argv[])
{
daemon(0,0);
while(1)
{
sleep(10)
/*do something*/
}
return 0;
}