本文内容:
1.守护进程的定义
2.守护进程的作用
3.守护进程的创建过程
一.守护进程的定义
1.守护进程是脱离于终端并且在后台运行的进程
2.守护进程脱离终端是为了避免在执行过程中的信息在任何终端上显示,并且不被任何终端产生的终端信息所打断
3.守护进程通常在系统引导装入时启动
二.守护进程的作用
1.守护进程是一个生存周期较长的进程,通常独立于控制终端并且周期性的执行某种任务或者等待处理某些待发生的事件
2.大多数服务都是通过守护进程实现的
3.关闭终端,相应的进程都会被关闭,而守护进程却能够突破这种限制
三.守护进程的创建过程
背景知识:
1. 进程组:一个或多个进程的集合,进程组由进程组ID标识,进程组长的进程ID和进程组ID一致,并且进程组ID不会由于进程组长的退出而受到影响
2. 会话周期:一个或多个进程组的集合,比如用户从登陆到退出,这个期间用户运行的所有进程都属于该会话周期
3.setsid函数:创建一个新会话,并担任该会话组的组长,调用setsid函数的目的:让进程摆脱原会话,原进程组,原终端的控制
创建守护进程的过程:
1.创建子进程,父进程退出
子进程变成孤儿进程,然后由1号init进程收养
2.子进程创建新会话
调用setsid创建新的会话,摆脱原会话,原进程组,原终端的控制,自己成为新会话的组长
3.将当前目录改为根目录
正在运行的进程文件系统不能卸载,如果目录要回退,则此时进程不能做到,为了避免这种麻烦,以根目录为当前目录
4.重设文件权限掩码
子进程的文件权限掩码是复制的父进程的,不重新设置的话,会给子进程使用文件带来诸多麻烦
5.关闭不需要的文件描述符
子进程的文件描述符也是从父进程复制来的,那些不需要的文件描述符永远不会被守护进程使用,会白白的浪费系统资源,还可能导致文件系统无法结束
样例程序:守护线程每隔100s就向文件写入一句话
#include <iostream> #include<pthread.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include<semaphore.h> #include<sys/wait.h> #include<sys/types.h> #include<fcntl.h> #include<sys/stat.h> using namespace std; #define max_file 65535 int main() { pid_t pc; int fd,len; char buf[]="this is a demo "; len=strlen(buf); pc=fork();//第一步,创建子进程 if(pc<0) { cout<<"fork error"<<endl; exit(1); } else if(pc>0) { exit(0);//第二步,父进程退出 } else { setsid();//第三步,创建新会话 chdir("/");//第四步,将当前目录改为根目录 umask(0);//第五步,重新设置文件权限掩码 for(int i=0; i<max_file; i++) { close(i);//第六步,关闭不需要的文件描述符 } while(1) { if((fd=open("/tmp/dameo.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0) { cout<<"open erro"<<endl; exit(1); } write(fd,buf,len+1); close(fd); sleep(100);//每隔100s输出一句话到文件 } } }