首页 > 试题广场 >

LINUX中关于僵尸进程的说法正确的是

[单选题]
LINUX中关于僵尸进程的说法正确的是
  • 僵尸进程是由于父进程异常退出造成的
  • 僵尸进程是由于父进程未回收子进程造成的
  • 父进程在创建子进程时,调用2次fork,可以预防僵尸进程
  • 僵尸进程可以使用kill -9杀掉
僵尸进程是已经退出的进程了,所以无法使用kill 命令杀死僵尸进程。我们可以使用kill命令杀死僵尸进程的父进程,然后僵尸进程就会变成孤儿,会被init进程领养,init进程会回收僵尸进程的资源,进行妥善处理
发表于 2022-04-09 11:19:56 回复(0)

一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit, 它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。

在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位 置,记载该进程的退出状态等信息供其他进程收集。除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装 SIGCHLD 信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了, 那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是 为什么系统中有时会有很多的僵尸进程。

怎么查看僵尸进程

利用命令ps,可以看到有父进程ID为1的进程是孤儿进程;s(state)状态为Z的是僵尸进程。

注意:孤儿进程(orphan process)是尚未终止但已停止(相当于前台挂起)的进程,但其父进程已经终止,由init收养;而僵尸进程则是已终止的进程,其父进程不一定终止。

发表于 2021-04-22 18:16:21 回复(0)
调用两次fork()不是可以防止僵尸进程吗?为什么C不对?
发表于 2021-12-15 12:05:39 回复(1)
如果子进程先于父进程退出, 同时父进程又没有调用wait/waitpid,则该子进程将成为僵尸进程。
一般,为了防止产生僵尸进程,在fork子进程之后我们都要wait它们;同时,当子进程退出的时候,内核都会给父进程一个SIGCHLD信号,所以我们可以建立一个捕获SIGCHLD信号的信号处理函数,在函数体中调用wait(或waitpid),就可以清理退出的子进程以达到防止僵尸进程的目的。
发表于 2021-03-27 13:51:44 回复(0)