三、守护进程实例
守护进程实例包括两部分:主程序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,”I’m here at %s\n”,asctime(localtime(&t)) );
- fclose(fp);
- }
- }
- }
|
以上程序在RedHat Linux6.0下编译通过。步骤如下:
编译:
$ gcc –g –o test init.c test.c 执行:./test 查看进程:ps –ef |
从输出可以发现test守护进程的各种特性满足上面的要求。