/*===============================================
* 文件名称:protectprocess.c //守护进程
* 创 建 者:追光者
* 创建日期:2020年11月01日
* 描 述:创建守护进程将当前系统时间写入test.txt中。
创建步骤:
- 用fork函数创建进程并退出父进程
- 在子进程内用setsid函数创建会话期
- 用chdir函数更改文件目录
- 用umask函数设置文件权限掩码,利于文件权限的灵活性
- 关闭文件描述符,避免占用内存或者避免内存数据混乱
具体程序如下:
================================================*/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include <strings.h>
#include <time.h>
int main()
{
//创建进程
pid_t pid;
if((pid = fork()) < 0)
{
perror("fork");
return -1;
}
else if(pid>0){
exit(0);//关闭父进程
}
//在子进程里创建会话期
if(setsid()<0){
perror("setsid");
return -1;
}
//改变工作路径
if(chdir("/tmp")<0){
perror("chdir");
return -1;
}
//设置掩码权限,使文件权限更加灵活
umask(0);
//定义变量关闭文件描述符个数
int i =0;
int tablesize = getdtablesize();//getdtablesize()函数是获取文件描述符个数。
for(i=0;i<tablesize;i++)
close(i);
int fd = open("test1.txt",O_RDWR | O_CREAT,0640);//创建文件描述符
if(fd<0){ //判断是否创建成功
perror("open");
return -1;
}
int cnt=0; //行数计数初始化
char buf[32]={0}; //缓冲区定义
while(read(fd,buf,32)){ //将缓冲区32字节大小数据读入文件
int i=0;
while(i<32){
if(buf[i] == 'n') //当读到'n'时计数
cnt++;
i++;
}
bzero(buf,sizeof(buf)); //没读一次需进行数据清零操作避免造成数据黏合问题
}
while(1){
char buf[32]={0};
sprintf(buf,"%d ",cnt++);//将cnt计数写入buf内
struct tm *p; //结构体指针
time_t now;
time(&now);
p = localtime(&now); //获取系统时间
sprintf(buf," %4d-%02d-%02d %02d:%02d:%02dn",p->tm_year+1900,p->tm_mon+1,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
if(write(fd,buf,strlen(buf))) //如果写入数据则结束循环
break;
}
close(fd);
return 0;
}
![6af99bd9fdf9ae8d5267c684f1034ece.png](https://i-blog.csdnimg.cn/blog_migrate/a5e357b94fce0c4ad543532942fabeae.jpeg)