守护进程是一个在后台运行并且不受任何终端控制的进程。Unix操作系统有很多典型的守护进程(其数目根据需要或20—50不等),它们在后台运行,执行不同的管理任务。
守护进程实现的步骤:
(1)调用fork让程序转入后台运行。
(2)脱离终端。
用setsid设置会话组长。
(3)再次fork以避免无意中获得新的控制终端
(4)改变工作目录和文件创建模式掩码
chdir("/") 和 umask(0)
(5)关闭所有非必要的文件描述符。将0,1,2描述符转到null文件中。
for(i=0;i<1024;i++)
{
close(i);
}
open("/dev/null",O_RDONLY);//0
open("/dev/null",O_RDWR);//1
open("/dev/null",O_RDWR);//2
openlog(pname,LOG_PID,facility);
(5)屏蔽SIGCHLD 和 SIGHUP信号
signal(SIGCHLD,SIG_IGN);
signal(SIGHUP,SIG_IGN);
代码实现:
daemon_init(const char *pname,int facility)
{
int i;
pid_t pid;
if((pid = fork()) < 0)
return -1;
else if(pid)
exit(0);
if(setsid()<0)
return -1;
signal(SIGHUP,SIG_IGN);
signal(SIGCHLD,SIG_IGN);
if((pid = fork()) < 0)
return -1;
else if(pid)
exit(0);
chdir("/");
for(i=0;i<1024;i++)
{
close(i);
}
open("/dev/null",O_RDONLY);//0
open("/dev/null",O_RDWR);//1
open("/dev/null",O_RDWR);//2
openlog(pname,LOG_PID,facility);
return 0;
}