【Linux世界中的孤儿】
在Linux中,通过fork()函数和vfork()函数来创建一个进程。进程都是由父进程创建的,一般情况下子进程退出后需要父进程来清理子进程退出后留下的"垃圾",父进程是调用wait()或waitpid()系统调用获得的子进程的终止状态。
一、孤儿进程
1.什么是 孤儿进程
如果一个子进程的父进程先于子进程 结束, 子进程就成为一个孤儿进程,它由 init (pid=1)进程收养,成为 init 进程的子进程
孤儿进程即父进程先于子进程终止的进程,会被init接管,其父进程变为1。
孤儿进程组的概念:组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员。
一个进程组不是孤儿进程组的条件:该组有一个进程,其父进程在同一会话的另一个组中。进程组不是孤儿进程组,在属于同一会话的另一个组中的父进程就有机会重启该组中停止的进程。
孤儿进程组的概念可以理解为组内所有的进程按照父子关系构建成树形结构,树根为init(1),如果组内所有进程都在此树的节点内覆盖,则说明这些进程构成孤儿进程组。
孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。
总结:
孤儿进程:一个父进程退出,而它的一个或多个子进程还在进行,那么那些子进程将成了孤儿进程,孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。僵尸资源会造成资源浪费,孤儿进程则不会。
二、什么是守护进程呢
(daemon) 指在后台运行,没有控制终端与之相连的进程。它独立于控制终端.通常周期性地执行某种任务 。
1、守护进程为什么要脱离后台去运行呢?
守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断
2、为什么要引入守护进程:
由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时才退出。如果想让某个进程不因为用户或终端或其他地变化而受到影响,那么就必须把这个进程变成一个守护进程。
3、守护进程的特性
1>守护进程最重要的特性是后台运行 。
2>其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是 shell )中继承下来的。
3>最后,守护进程的启动方式有其特殊之处。它可以在 Linux 系统启动时从启动脚本 /etc/rc.d 中启动,可以由作业规划进程 crond 启动,还可以由用户终端(通常是 shell )执行。
4、 守护进程的启动方式有多种:
a. 它可以在 Linux 系统启动时从启动脚本 /etc/rc.d 中启动
b. 可以由作业规划进程 crond 启动;
c. 还可以由用户终端(通常是 shell )执行。
总结:
守护进程是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。 Linux 系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程 crond 、打印进程 lqd 等(这里的结尾字母 d 就是 Daemon 的意思)。