概念不做阐述,本文主要内容为守护进程编程部分的知识说明
守护进程的编程流程:
1.fork退出父进程,保证留下的子进程是组员进程
2.利用setsid()创建新会话,把子进程挪到新的会话中 //获取会话是getsid()
3.fork退出父进程,保证在新会话中的子进程是组员进程
4.执行chdir(”/“),将工作目录改在根目录下,因为进程运行周期较长,可能会导致后期卸载不掉,所以放在不可被卸载的工作目录下
5.设置掩码umask(0) //4和5的顺序可以调换。
- umask :
- 第一位数字代表的是特殊权限忽略0,后三位数字为我们看到的文件/目录的默认权限,分别是所有者0、同组用户0、其他用户2。账号能有的目录最大权限为777,文件能有的最大权限为666。其中,其他用户other2表示不能拥有写权限。
6.关闭描述符
7. //如果后续程序内不断fork产生子进程时记得要处理,不要产生僵死进程。
守护进程流程代码
一般守护进程的后缀都是'd'结尾,现设置maind.c文件
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int main()
{
d_t pid=fork();//fork出子进程
if(pid!=0)//退出父进程
{
exit(0);
}
setsid();//创建新会话
pid=fork();
if(pid!=0)
{
exit(0);
}
chdir("/");
umask(0);
//getdtablesize();获取打开文件表的最大值
for(int i=0;i<getdtablesize();i++)
{
close(i);//关闭整个文件表
}
}
-- 插入 --
补充getdtablesize(),获取打开文件表的最大值
完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<time.h>
#include<sys/stat.h>
int main()
{
id_t pid=fork();//fork出子进程
if(pid!=0)//退出父进程
{
exit(0);
}
setsid();//创建新会话
pid=fork();
if(pid!=0)
{
exit(0);
}
chdir("/");
umask(0);
//getdtablesize();获取打开文件表的最大值
for(int i=0;i<getdtablesize();i++)
{
close(i);//关闭整个文件表
}
//上面是守护进程的所有流程,下面是自己要进行的操作
//执行对文件的打开操作
while(1)
{
FILE* fp=fopen("/tmp/maind.log","a");//a追加的方式打开
if(fp==NULL)
{
break;//文件为空,退出
}
//获取当前时间
time_t tv;
time(&tv);
//fprintf:把内容打印到指定文件内
fprintf(fp,"time is %s ",asctime(localtime(&tv)));
fclose(fp);
sleep(5);
}
}
stu
执行结果: