Linux 僵尸进程 孤儿进程

今天有人问到了僵尸进程 和孤儿进程,以前遇到过,但是没有太注意,这里mark 一下

僵尸进程 :进程 fork 出来子进程,但是 父进程没有调用wait
或waitpid 获取子进程的状态信息,子进程的进程描述符任然保存在系统中

查找僵尸进程

ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]‘

孤儿进程 :父进程退出,子进程任然在继续,孤儿进程将被init( 1) 收养,并由Init完成对他们的信息采集

僵尸进程的危害:进程退出时候,内核将释放所有资源,包括打开的文件、占用的内存的时候有,但是任然会保留一定的信息

,知道父进程通过wait/waitpid
来取的时候才释放,如果父进程不钓鱼wait waitpid
,这些保留的信息就不会释放,其进程号就会被一直占用,系统进程号有限,如果大量产生僵尸进程,系统就不能产生新的进程。

孤儿进程是没有父进程的进程,init 会负责善后工作,无什么危害

子进程(init除外) 在exit
后,不会马上消失,而是成为zombie,等待父进程处理

eg: 僵尸进程


 1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 #include<errno.h>
5
6
7 int main()
8 {
9 pid_t pid = fork();
10 if( pid < 0 )
11 {
12 printf("fork_error\n");
13 exit(1);
14 }
15 else if ( pid == 0 )
16 {
17 printf(" child \n");
18 exit(0);
19 }
20
21
22 printf("father....\n");
23 sleep(2);
24 system("ps -o pid,ppid,state,tty,command");
25 printf("father exit....");
26 return 0;
27 }

  其运行结果

  

  孤儿进程

  


#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>

int main()
{
pid_t pid = fork();
if( pid < 0 )
{
printf("fork_error\n");
exit(1);
}
else if ( pid == 0 )
{
printf(" child \n");
printf("pid: %d\tppid:%d\n",getpid(),getppid());
printf("sleep ...");
sleep(4);
printf("pid: %d\tppid:%d\n",getpid(),getppid());
printf("child exit ...");
exit(0);
}

printf("father....\n");
printf("father exit....");
return 0;
}

  运行结果:

   

时间: 2024-08-05 07:49:16

Linux 僵尸进程 孤儿进程的相关文章

浅析三种特殊进程:孤儿进程,僵尸进程和守护进程.

其实有时想想linux内核的设计也蕴含着很多人生哲学,在linux中有这么几个特殊进程中,我们一开始见到它们的名字可能还会觉得很诧异,但在了解完了原理后,我们仔细想想,这样的命名也不无道理!下面我就给大家分别介绍一下这三种特殊的进程! 1.孤儿进程 如果父进程先退出,子进程还没退出那么子进程将被 托孤给init进程,这是子进程的父进程就是init进程(1号进程).其实还是很好理解的. #include <sys/types.h> #include <unistd.h> #inclu

僵尸进程 孤儿进程

当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()取得子进程的终止状态.如果进程不调用wait/waitpid的话,那么系统保留的那段子进程信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程. 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作.

系统编程之进程的创建.僵尸与孤儿进程

一.进程 进程是正在执行的程序实例.执行程序时,内核会将程序代码载入虚拟内存,为程序变量分配空间,在内核中建立相应的数据结构,以记录与进程有关的各种信息(比如,进程ID.用户ID.组ID以及终止状态等) 在内核看来,进程是一个个实体,内核必须在它们之间共享各种计算机资源.对于像内存这样的受限资源来说,内核一开始会为进程分配一定数量的资源,并 在进程的生命周期内,统筹该进程和整个系统对资源的需求,对这一分配进行调整.程序终止时,内核会释放所有此类资源,供其他进程重新使用.其他资源(如 CPU.网络

戏说守护、僵尸、孤儿进程

首先说简单的结论: 没有父进程的进程就是孤儿进程,孤儿进程会被init领养,成为一个准守护进程. 如果进程他爹活着,但是不给子进程收尸(wait.waitpid),子进程就会变成僵尸. 守护进程(Daemon)是在一类脱离终端在后台执行的程序, 通常以 d 结尾, 随系统启动, 其父进程 (ppid) 通常是 init 进程 以下是Wikipedia中关于Daemon的定义: In multitasking computer operating systems, a daemon (/dimn/

Linux下的僵尸进程和孤儿进程

说明 在UNIX里,除了进程0(即PID=0的交换进程,Swapper Process)以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程. 操作系统内核以进程标识符(Process Identifier,即PID)来识别进程.进程0是系统引导时创建的一个特殊进程,在其调用fork创建出一个子进程(即PID=1的进程1,又称init)后,进程

fork()函数的执行过程、孤儿进程和僵尸进程

说起fork就不得不提COW(Copy On Write),就是"写时拷贝".也就是当fork发生时,子进程根本不会去拷贝父进程的内存页面,而是与父进程共享.当子进程或父进程需要修改一个内存页面时,Linux就将这个内存页面复制一份给修改者,然后再去修改,这样从用户的角度看,父子进程根本就没有共享什么内存.COW也就是进程要写共享的内存页面,先复制再改写. 采用了COW技术后,fork时,子进程还需要拷贝父进程的页面表.这种拷贝的代价就非常小了,对于CPU来说用不了几个时钟周期. 1.

进程控制、孤儿进程和僵尸进程

一.进程控制 1.进程标识 1.操作系统里每打开一个进程都会创建一个进程ID,这是唯一标识进程的编号,即PID. 2.PID 在任何时刻都是唯一的,但是可以重用.当进程终止并被回收以后,其 PID 就会被系统回收 3.进程的 PID 由系统内核根据延迟重用算法生成,以确保新进程的 PID 不同于最近终止进程的 PID. 4.进程PID的最大值是有限的(因系统的不同而不同),需要及时回收 2.特殊进程 0 号进程:通常是调度进程,常常被称为交换进程(swapper).该进程是内核的一部分,所有进程

进程——wait与waitpid、僵尸进程与孤儿进程

僵尸进程:子进程终止了,但是父进程没有回收子进程的资源PCB.使其成为僵尸进程 孤儿进程:父进程先与子进程结束了,使得子进程失去了父进程,这个时候子进程会被1号进程init进程领养,成为孤儿进程 为了防止上面两种情况,我们应当在父进程结束之前一定要回收子进程的所有资源 所以出现了wait和waitpid #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status); pid_t waitpid(pid_t

(转)进程间关系:进程、僵尸进程、孤儿进程、进程组、前台进程组、后台进程组、孤儿进程组、会话、控制终端

不同的shell对使用管道线时创建子进程的顺序不同,本文以bash为例,它是支持作业控制的shell的典型代表. 僵尸进程与孤儿进程 僵尸进程:先于父进程终止,但是父进程没有对其进行善后处理(获取终止子进程有关信息,释放它仍占有的资源).消灭僵尸进程的唯一方法是终止其父进程.孤儿进程:该进程的父进程先于自身终止.其特点是PPID=1(init进程的ID).一个孤儿进程可以自成孤儿进程组. 文中用到的缩写 PID = 进程ID (由内核根据延迟重用算法生成)PPID = 父进程ID(只能由内核修改