三. 守护进程实例
守护进程实例包含两部分:主程序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; if(pid=fork()) exit(0);//是父进程,结束父进程 else if(pid< 0) exit(1);//fork失败,退出 //是第一子进程,后台继续执行 setsid();//第一子进程成为新的会话组长和进程组长 //并与控制终端分离 if(pid=fork()) exit(0);//是第一子进程,结束第一子进程 else if(pid< 0) exit(1);//fork失败,退出 //是第二子进程,继续 //第二子进程不再是会话组长 for(i=0;i< NOFILE;++i)//关闭打开的文件描写叙述符 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,"Im here at %s/n",asctime(localtime(&t)) ); fclose(fp); } } } |
以上程序在RedHat Linux6.0下编译通过。过程例如以下:
编译:gcc -g -o test init.c test.c
执行:./test
查看进程:ps -ef
从输出能够发现test守护进程的各种特性满足上面的要求。