(叉)( / execve)在这个过程中,父进程的子进程仍然存在的假设,和母(叉)不在SIGCHLD信号处理函数调用安装(waitpid)等待子进程结束,并没有明确地忽略该信号,那么孩子的过程变得一个僵尸进程,不会结束,即使在这个时候根本是kill-9不能杀死僵尸进程的身份。补救的办法是杀死僵尸进程的父进程(的僵尸进程的父进程是必然存在的)。僵尸进程变成孤儿进程,并被传递给1号进程init,init总是负责清理僵尸进程。



僵尸过程指的是已经退出的父进程,在进程没有进程接受之后,它变成了一个僵尸进程。(僵尸)进程。



如何生成僵尸进程:



一个过程结束了自己的生命,调用exit命令的时候,但它并没有真正的被销毁,但留下一个僵尸的过程称为(僵尸)的数据结构(exit系统调用,它的作用过程,但仅限于一个正常的过程,变成僵尸的过程,不能完全破坏)在Linux进程的状态,僵尸进程



很特别。它放弃了几乎所有的内存空间,没有任何可执行代码,也不能被分派。它只保留进程列表中的一个位置,它记录进程的后退。



此外,僵尸进程不再占用任何内存空间。它需要它的父进程为它收尸,如果他的父进程没有安装SIGCHLD信



数字处理功能调用wait或waitpid()等待子进程结束,并没有明确地忽略该信号。然后它保持僵尸状态。如果父进程结束,则init进程是自动的。



这个过程将被接管为它收尸,它仍然可以被清除,但是如果父进程是一个循环,它不会结束,那么子进程会一直保持僵尸。这就是为什么有时候系统中有很多僵尸进程。



Linux系统限制运行的进程数。如果太多的僵尸进程占据了可用的进程号,就会导致无法生成的新进程,这是僵尸进程对系统的最大危害。



僵尸过程的一个例子:



/ * ----- zombie1。C ----- * /



#包括系统 /类型。H



#包括系统 /等。H



#包括stdio. h



#包括unistd。H



int main(int argc、argv char * { })



{



(1)



{



pid_tχ=叉();



如果(= 0)



{



execl( /斌/ bash



}



睡眠(2);



}



不会停止生产过程;



/ * ----- zombie2。C ----- * /



#包括



#包括



主要()



{



如果(!叉()



{



printf(孩子PID = % DN



出口(0);



}



等待(*);



/ * waitpid(1,null,0);* /



睡眠(60);



printf(父PID = %d n



出口(0);



}



在60年代,僵尸过程不断产生,知道父进程的出口(0);



如果等待 / waitpid调用的子过程收集尸体,不会有僵尸进程。



PS:运行实例,首先通过gcc编译zombie1。C O的僵尸,然后运行僵尸;



然后可以使用ps - EF来查看僵尸进程是否已经生成。



如何看待僵尸过程:



使用命令ps,您可以看到标记为Z的进程是僵尸进程。



如何删除僵尸进程:



1。重写父进程和子收集的尸体后,孩子的过程是死的,具体方式是接管SIGCHLD信号。后子进程是死的,的SIGCHLD信号发送给父进程。父进程接收到这个信号后,waitpid()的功能是为子收尸的执行。这是原则的基础上,如果父进程没有呼叫等待,内核发送SIGCHLD消息,虽然默认处理是忽略。如果您想响应此消息,您可以设置一个处理函数。



2。杀死父进程。在父进程死亡后,僵尸进程变成孤儿进程。它传递到init 1。init总是负责清理僵尸进程。所有生成的僵尸进程也将消失。