Linux 的进程组、会话、守护进程
一、进程组ID
每个进程都属于一个进程组。每个进程组有一个领头进程。进程组是一个或多个进程的集合,通常它们与一组作业相关联,可以接受来自同一终端的各种信号。每个进程组都有唯一的进程组ID(整数,也可以存放在pid_t类型中)。进程组由进程组ID来唯一标识。除了进程号外(PID)之外,进程组ID也是一个进程的必备属性之一。
二、会话会话是一个或多个进程组的集合。例如:
#include<unistd.h>pid_t setsid(void); 如果调用此函数的进程不是一个进程组的组长,则此函数就会创建一个新的会话,结果发生三件事:1、该进程变成新会话的首进程。此时,该进程是新会话中唯一的进程。2、该进程成为一个进程组的组长进程。新的进程组ID就是调用进程的ID。3、该进程没有控制终端。如果在调用setsid之前该进程有一个控制终端,那么这种联系也会断掉。如果该进程已经是一个进程组的组长,则此函数返回错误。为了保证不会发生这种事情,通常先调用fork,然后使其父进程终止,而子进程则继续。因为子进程继承了父进程的组ID,而其ID是新分配,两者不可能相等,所以就保证了子进程不会是一个进程组长。
三、守护进程在linux或者unix系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程。为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一定的方式配置系统。 守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。
守护进程编程步骤 1. 创建子进程,父进程退出 ?所有工作在子进程中进行 ?形式上脱离了控制终端 2. 在子进程中创建新会话 ?setsid()函数 ?使子进程完全独立出来,脱离控制 3. 改变当前目录为根目录 ?chdir()函数 ?防止占用可卸载的文件系统 ?也可以换成其它路径 4. 重设文件权限掩码 ?umask()函数 ?防止继承的文件创建屏蔽字拒绝某些权限 ?增加守护进程灵活性 5. 关闭文件描述符 ?继承的打开文件不会用到,浪费系统资源,无法卸载 ?getdtablesize() ?返回所在进程的文件描述符表的项数,即该进程打开的文件数目
该实例首先创建了一个守护进程,然后让该守护进程每个10s在/tmp/dameon.log中写入一句话。