三. 守护进程实例 守护进程实例包括两部分:主程序test.c和初始化程序init.c。主程序每隔一分钟向/tmp目录中的日志test.log报告运行状态。初始化程序中的init_daemon函数负责生成守护进程。读者可以利用init_daemon函数生成自己的守护进程。 1. init.c清单 #include < unistd.h > #include < signal.h > #include < sys/param.h > #include < sys/types.h > #include < sys/stat.h > void init_daemon(void) { int pid; int i;
exit(0);//是父进程,结束父进程 else if(pid< 0) exit(1);//fork失败,退出 //是第一子进程,后台继续执行
//并与控制终端分离 if(pid=fork()) exit(0);//是第一子进程,结束第一子进程 else if(pid< 0) exit(1);//fork失败,退出 //是第二子进程,继续 //第二子进程不再是会话组长
close(i); chdir("/tmp");//改变工作目录到/tmp umask(0);//重设文件创建掩模 return; } 2. test.c清单 #include < stdio.h > #include < time.h > void init_daemon(void);//守护进程初始化函数 main() { 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 %sn",asctime(localtime(&t)) ); fclose(fp); } } } 以上程序在RedHat Linux6.0下编译通过。步骤如下: 编译:gcc –g –o test init.c test.c 执行:./test 查看进程:ps –ef 从输出可以发现test守护进程的各种特性满足上面的要求。 |
|