系统官网网站模板下载,怎么做淘宝优惠卷网站,wordpress注册可见插件,江门网站制作华企立方1 守护进程中涉及到的基本概念1.1进程组1.1.1 进程组基本概念进程组是一个或多个进程的集合#xff0c;可以接收来自同一个终端的各种信号。每运行一个程序或是命令都将产生一个进程组。每个进程属于一个进程组#xff0c;而每个进程组都存在一个领头进程(或是叫组长进程)可以接收来自同一个终端的各种信号。每运行一个程序或是命令都将产生一个进程组。每个进程属于一个进程组而每个进程组都存在一个领头进程(或是叫组长进程)一般进程组的第一个进程是领头进程。领头进程可以创建一个进程组、创建该组中的进程。领头进程fork出的子进程也将在该进程组中一旦子进程执行exec等退出函数就不再属于该进程组。进程组的生命周期从创建开始到最后一个进程离开为止成为进程组的生命周期。组中最后一个进程的离开可以是终止或加入其他进程。进程组的生命周期与组长进程是否终止无关只要有一个进程存在进程组的生命周期就未结束。1.1.2 相关命令1、查看所有进程组pid(即领头进程的pid)ps –A –o pgrp | sort |uniq2、查看某个进程的进程组pidps –C 进程名 –o pgrp3、根据进程名获得进程pidpidof 进程名4、根据进程pid获得进程名ps –aux |grep 进程pid5、获取某个进程的具体信息ps –ef |grep 进程名或进程pid1.1.3 相关函数#include pid_t getpgrp(); //获取进程组pid即进组中的领头进程的pid相当于调用getpgid(0)pid_t getpid(); //获取当前进程pidpid_t getppid(); //获取当前进程的父pidpid_t getpgid(); //返回指定进程的进程组pidint setpgid(pid_t pid, pid_t pgid); /*将pid进程的进程组id设置为pgid如果两个参数相等*则pid指定的进程变成进程组组长。如果pid是0则进程*组id为pgid如果pgid是0则进程组id为pid。*/int setpgrp(); //将当前进程所属的进程组的pid设置为当前进程的pid相当于setpgid(0, 0)1.2会话1.2.1 会话基本概念一次登录形成一个会话一个会话可包括多个进程组(www.linuxidc.com一个前台进程组和多个后台进程组)但只能有一个前台进程组。1.2.2 相关函数#include pid_t setsid();当调用该函数的进程不是进程组的领头进程时该函数才能建立新的会话。函数调用成功后调用进程成为新会话的领头进程和新进程的领头进程同时进程失去控制终端。1.3控制终端进程组中有领头进程类似地会话中也对应有领头进程。会话的领头进程打开一个终端之后该终端就成为会话的控制终端与控制终端建立连接的会话的领头进程成为控制进程(session leader)。一个会话只能有一个控制终端同时一个控制终端只能一个会话。 产生在控制端上的输入和信号(比如按下ctrlc就会产生SIGINT信号)将发送给会话的前台进程组中的所有进程。2守护进程及其特性1、守护进程最重要的特性是后台运行2、守护进程必须与其运行前的环境脱离开来。这些环境包括未关闭的文件描述符控制终端会话和进程组工作目录等这些环境通常是从执行它的父进程(特别是Shell)中继承下来的。3、守护进程可以在Linux系统启动时从脚本/etc/rc.d中启动可以由作业规划进程crond启动还可以由用户终端(通常是Shell)执行。3 守护进程编程针对守护进程的特性可以将普通进程改造为守护进程。3.1后台运行特性让daemon在子进程中运行。if( pidfork() ){exit(0); //父进程结束子进程继续}3.2脱离环境3.2.1脱离进程组、登录会话和控制终端进程组、登录会话和控制终端通常都是从父进程继承下来的为了不受它们的影响控制终端必须将其摆脱。具体方法是调用setsid函数。通过if( pidfork() ){exit(0);}将产生了子进程能保证调用setsid的进程不是进程组中的领头进程。当setsid调用成功后该子进程成为新会话中的领头进程和进程组的领头进程并脱离了原来的会话、进程组和控制终端。3.2.2禁止进程打开控制终端if( pidfork() ){exit(0); //该子进程结束又产生子进程}结束该子进程产生新的子进程此时的新子进程不是会话领头进程所以不能打开控制终端。通过这种方式就能禁止进程打开控制终端。3.2.3脱离打开的文件描述符进程从其父进程继承了打开的文件描述符。如不关闭将会造成系统资源的浪费同时造成进程所在的文件系统无法卸载以及引起其他无法预料的错误。max_fd sysconf(_SC_OPEN_MAX);for(i 0; i max_fd; i){