守护进程的学习
在linux或者unix中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程。为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一定的方式配置系统。 守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。
- # include <stdio.h>
- # include <stdlib.h>
- # include <string.h>
- # include <unistd.h>
- # include <sys/stat.h>
- # include <sys/param.h>
- # include <sys/types.h>
- # include <signal.h>
- int init_deamon(void)
- {
- pid_t pid;
- int i;
- if((pid = fork()) == -1)
- {
- exit(-1);
- }
- if(pid > 0)
- {
- //父进程退出,使shell成为前台进程
- exit(0);
- }
- //第一进程
- //第一进程成为新会话和新进程的领头进程同时也失去控制端
- setsid();
- if((pid = fork()) == -1)
- {
- exit(-1);
- }
- if(pid > 0 )
- {
- exit(0);
- }
- //孙进程
- for(i = 0; i<NOFILE;++i)
- {
- close(i);
- }
- chdir("/tmp");
- umask(0); //改变文件创建掩码
- return;
- }
- //每隔30s向/tmp/test.log报告系统中正在运行和运行过的进程列表
- int main()
- {
- FILE *fp;
- FILE *p;
- char buf[256];
- init_deamon();
- while(1)
- {
- sleep(30);
- if((fp = fopen("/tmp/test.log","a")) > 0)
- {
- p = popen("ps -ef","r");
- while(fgets(buf,sizeof(buf),p) != 0)
- {
- fprintf(fp,"%s\n",buf);
- }
- pclese(p);
- }
- fclose(fp);
- }
- exit(0);
- }