在后台一直运行的进程为守护进程。
建立守护进程的5个步骤:
1,fork()创建子进程后,父进程立即退出。这样子进程就变为孤儿进程。
2,调用setsid():是创建的进程脱离控制终端,同时创建新的 进程组,使得新创建的进程为该进程组的首进程。
3,再用fork(),产生 的子进程将继承父进程的当前工作目录。注:如果当前进程没结束,其工作目录就不能被卸载,为了避免这种情况,需将工作目录切换下,chdir(“/home/”)。
4,关闭文件描述符。新的子进程继承了父进程打开的文件描述符,子进程不用这些,需要将其关闭。
5,守护进程创建了一些临时文件,umask()将这些屏蔽。
用scribes建立daemon.c文件:
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<sys/param.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <stdio.h>
#include <time.h>
void init_daemon(void) //守护进程初始化函数
{
int pid;
int i;
if(pid=fork()) //步骤1
exit(0); //是父进程,结束父进程
else if(pid< 0)
exit(1); //fork失败,退出
setsid(); //步骤2
if(pid=fork()) //步骤3
exit(0); //是第一子进程,结束第一子进程
else if(pid< 0)
exit(1); //fork失败,退出
chdir("/tmp"); //改变工作目录到/tmp
for(i=0;i< NOFILE;++i) //关闭打开的文件描述符 步骤4
close(i);
umask(0); //重设文件创建掩模 //步骤5
return;
}
void init_daemon(void);
int main(int argc,char* argv[])
{
FILE *fp;
time_t t;
init_daemon(); //初始化为Daemon
while(1) //每隔一分钟向test.log报告运行状态
{
sleep(60); //睡眠一分钟
if((fp=fopen("test.log","a")) >=0)
{
t=time(0);
fprintf(fp,"I'm here at %s\n",asctime(localtime(&t)));
fclose(fp);
}
}
return 0;
}
输出: