创建守护进程

来源:互联网 发布:海淘网站哪个好 知乎 编辑:程序博客网 时间:2024/05/16 15:52


创建方法:1.创建子进程,杀死父进程2.建立新的会话3.设立当前目录为根文件目录4.重设文件掩码5.关闭不需要的文件描述符

题目:写一个程序,有守护模式和常规模式,写一个日志文件,每隔一秒向文件中写入当前日期时间

运行时:./a.out  1(daemon mode )  /log

运行效果:



#include<stdio.h>#include<stdlib.h>#include <unistd.h>#include <time.h>int deamon_mode(){pid_t pid;int fd_maxsize,fd;if((pid = fork()) < 0){fprintf(stderr,"fail to fork \n");exit(EXIT_FAILURE);}if(pid > 0){exit(EXIT_SUCCESS);}setsid(); //创建新的会话chdir("/");//设置工作目录为根目录umask(0);//设置文件权限掩码
fd_maxsize = gettablesize(); 
for(fd = 0 ; fd < fd_maxsize; fd++){close(fd); //关闭不需要的文件描述符}return 0;}int get_line(FILE *fp){int line = 0;char buf[1024];while(fgets(buf,sizeof(buf),fp) != NULL){line ++;}return line;}int do_log(const char *filename){FILE *fp = NULL;int line;time_t tm;struct tm *ptm;if((fp = fopen(filename,"a+")) == NULL){fprintf(stderr,"fail to fopen %s\n",filename);exit(EXIT_FAILURE);}line = get_line(fp); //获取当前文件有多少行
while(1){tm = time(NULL);ptm = localtime(&tm);fprintf(fp,"%d %d-%d-%d %d:%d:%d \n ",line++,ptm->tm_year,ptm->tm_mon,ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);fflush(fp); //刷新缓存
sleep(1);}return 0;}int main(int argc, const char *argv[]){int deamon;if(argc < 3){fprintf(stderr,"Usage : %s mode filename\n",argv[0]);exit(EXIT_FAILURE);}deamon = atoi(argv[1]);if(deamon){deamon_mode();}do_log(argv[2]);return 0;}


	
				
		
原创粉丝点击