0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

Linux阅码场 来源:网络整理 作者:工程师陈翠 2018-07-28 10:09 次阅读

什么是僵尸

首先要明确一点,僵尸进程的含义是:子进程已经死了,但是父进程还没有wait它的一个中间状态,这个时候子进程是一个僵尸。正常情况下子死,父wait,清理掉子进程的task_struct,释放子进程的PID:

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

编译上述程序,运行,我们看到2个a.out进程:

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

杀死子进程4578,看到父进程的打印:

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

之后,4578会消失,因为父进程执行到了wait,也知道了子进程是被信号2杀掉的。

但是如果子进程死了,父进程不执行到wait,比如把上图中的"#if 0"改为"#if 1",杀死子进程后,子进程就是一个僵尸:

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

我们重新运行,当我们用kill -2杀掉子进程4628后,我们发现4628成为一个僵尸,状态变为Z+,名字上也加了一个棺材[],成为[a.out]:

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

僵尸不可能被杀死

我们看到上面4628是个僵尸很不爽,所以我们想把它干掉,据说Linux有个信号9,神挡杀神,佛挡杀佛,我们现在来用kill -9干掉4628:

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

从上图可以看出,我们把4628用kill -9捅了好多刀,但是最后看4628这个僵尸,还是没有消失。

因为僵尸已经是死了,它不可能再次被杀死,你给它捅一万刀,它也是个死人,不可能再次死!

僵尸不可能被杀死,因为它已经死了!只等父进程来wait清理尸体了。

一个僵尸可以被杀死的假象

下面的这个程序证明“僵尸可以被杀死”:

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

我们在主线程里面,pthread_create()创建线程后,pthread_exit()退出,这个时候我们会发现,在ps命令里面,a.out显示为一个僵尸:

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

这个时候我们来杀死4730这个僵尸:

kill -9 4730

我们会惊奇地发现,4730真地会从ps命令里面消失!

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

我们把时间轴拉回调用"kill -9 4730"之前。刚才我们“看起来”能杀死僵尸的本质原因是,当主线程4730调用pthread_exit()退出后,主线程4730的状态确实是僵尸了,但是该进程里面的4731线程,却没有死:

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

看看4731:

什么是僵尸进程_Linux僵尸进程可以被“杀死”吗?

4731是活着的,证明整个进程并没有挂。

那么,根据POSIX标准关于信号(signal)的定义,当我们执行kill -9 4730(4730是4730和4731的TGID,也是整个进程用户态视角的PID)的时候,是要杀死整个4730进程的,所以这个时候4731被我们杀死,整个进程就都死了,这个时候,执行到父进程的wait逻辑,导致僵尸消失。

所以,在本例中,kill -9 4730看起来是"杀死了僵尸”,实际是杀死了4731,导致整个进程死

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11219

    浏览量

    208879

原文标题:宋宝华: Linux僵尸进程可以被“杀死”吗?

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux系统下进程的几种状态介绍

    文章对 Linux 系统下进程的几种状态进行介绍,并对系统出现大量僵尸进程和不可中断进程的场景进行分析,使用常用的几种工具进行问题分析定位。
    发表于 11-24 16:15 1.2w次阅读
    <b class='flag-5'>Linux</b>系统下<b class='flag-5'>进程</b>的几种状态介绍

    Linux学习杂谈】之进程状态

    正在运行,也就是就绪态的进程进入运行的一个状态,得到CPU的执行权限3.僵尸僵尸态就是进程结束了,但是相应的资源没有
    发表于 09-27 00:36

    孤儿进程僵尸进程

    ,并可以用ps命令去查看,它的状态是“Z”。三.解决方案1)kill杀死元凶父进程(一般不用)严格的说,僵尸进程并不是问题的根源,罪魁祸首是
    发表于 11-29 14:08

    Linux下的进程结构

    调试器暂停。当一个进程另一个进程监控时(如调试器使用ptrace()系统调用监控测试程序),任何信号都可以把这个进程置于跟踪状态。 ●
    发表于 05-27 09:24

    什么是僵尸进程和孤儿进程

    在UNIX里,除了进程0(即PID=0的交换进程,Swapper Process)以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新
    发表于 08-02 08:36

    为什么会出现LINUX僵尸进程

    僵尸进程出现在父进程没有回收子进程的PCB的时候,这个时候子进程已经结束,但是父进程没有回收他,
    发表于 08-07 06:48

    进程有几种状态?

    ?线程间同步方法有哪些?什么是内核线程和用户线程?内核线程和用户线程的区别?内核线程和用户线程有什么优缺点?什么是僵尸进程,孤儿进程,守护进程僵尸
    发表于 12-24 07:16

    僵尸进程的产生介绍和危害以及解决方法

    如果你经常使用 Linux,你应该遇到这个术语“僵尸进程Zombie Processes”。 那么什么是僵尸进程? 它们是怎么产生的? 它们
    的头像 发表于 12-18 15:56 5744次阅读
    <b class='flag-5'>僵尸</b><b class='flag-5'>进程</b>的产生介绍和危害以及解决方法

    你知道僵尸进程是个什么东西?

    在UNIX系统中,僵尸进程是指完成执行(通过exit系统调用,或运行时发生致命错误或收到终止信号所致)但在操作系统的进程表中仍然有一个表项(进程控制块PCB),处于”终止状态“的
    发表于 04-22 17:50 1241次阅读

    Linux 系统中僵尸进程

    不合理,父进程从不调用 wait 等系统调用来收集僵尸进程,那么这些进程会一直存在内存中。在 Linux 下,我们
    发表于 04-02 14:40 435次阅读

    Linux数据中心服务器上的僵尸进程怎样正确的处理

    。虽然僵尸进程不像运行中的流氓应用程序那样占用宝贵资源,但可能会构成威胁。
    发表于 09-30 17:29 858次阅读
    <b class='flag-5'>Linux</b>数据中心服务器上的<b class='flag-5'>僵尸</b><b class='flag-5'>进程</b>怎样正确的处理

    Linux僵尸进程会被杀死吗?

    那么,根据POSIX标准关于信号(signal)的定义,当我们执行kill -9 4730(4730是4730和4731的TGID,也是整个进程用户态视角的PID)的时候,是要杀死整个4730进程的,所以这个时候4731被我们
    发表于 08-07 16:48 357次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>僵尸</b><b class='flag-5'>进程</b>会被<b class='flag-5'>杀死</b>吗?

    如何在Linux终止僵尸进程

    在了解Zombie进程之前,让我回忆一下什么是进程。简而言之,进程是程序实例。它可以是前台的交互式进程或后台的非交互式或自动
    的头像 发表于 12-12 17:40 2050次阅读

    linux下开发避免僵尸进程的方法

    一、什么是僵死进程? 一般情况下,程序调用exit(包括_exit和_Exit,它们的区别这里不做解释),它的绝大多数内存和相关的资源已经内核释放掉,但是在进程表中这个进程项(ent
    的头像 发表于 11-11 16:38 701次阅读
    <b class='flag-5'>linux</b>下开发避免<b class='flag-5'>僵尸</b><b class='flag-5'>进程</b>的方法

    如何查看系统是否有僵尸进程

    进程中的指令已经执行完成,但是进程PCB结构还没有回收。   即子进程先于父进程退出后,子进程的PCB需要其父
    的头像 发表于 11-29 15:52 6894次阅读
    如何查看系统是否有<b class='flag-5'>僵尸</b><b class='flag-5'>进程</b>