一、守护进程特点及概念
- 运行时间较长
- 后台运行,不需要和用户交互
例:数据库的服务端
二、相关概念
1.会话
由用户通过打开终端而标识的会话
2.会话首进程
整个会话中首个执行的进程的id
3.进程组
(方便对进程的管理)
4.组长进程
用于标识进程组
三、守护进程编程
1.流程
- 先fork,退出父进程(做组员)
- 创建新会话 setsid() (脱离原会话,做新会话的组长进程)
- 再fork,退出父进程
- chdir("/");(由于运行时间长,为了避免不得已结束,故将守护进程放在)
- umask(0); (将掩码清零)
- 关闭所有文件描述符
- 如果有子进程,就要处理僵死进程
2.代码演示
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<time.h>
#include<sys/stat.h>
int fund()
{
pid_t pid = fork();
if(pid != 0)
{
exit(0); //终止父进程
}
setsid(); //
pid = fork();
if(pid != 0)
{
exit(0);
}
chdir("/");//
umask(0);//
int maxfd = getdtablesize();
int i = 0;
for(;i < maxfd; i++)
{
close(i);
}
}
int main()
{
fund();//
while(1)
{
FILE* fp = fopen("/tmp/c210d.log","a");
if( fp == NULL )
{
break;
}
time_t tv;
time(&tv); //1970-01-01
fprintf(fp,"current time:%s",asctime(localtime(&tv)));
fclose(fp);
sleep(5);
}
}