(转载)http://blog.chinaunix.net/uid-21206300-id-3018578.html

(1)产生僵尸进程

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main (int argc, char *argv[])
{pid_t pid = fork();if (pid == 0){int i = 0;while (i++ < 6){printf("child running...\n"); sleep(1);}}else if (pid > 0){while (1){printf("father running...\n"); sleep(1);}}else{printf("create failed\n");exit(0);}printf("Main exit()\n");return 0;
}

程序输出:

[root@localhost ~]# ./a.out
child running...
father running...
father running...
child running...
child running...
father running...
father running...
child running...
father running...
child running...
child running...
father running...
father running...
Main exit()
father running...
father running...
father running...
father running...
father running...
father running...

(2)产生孤儿进程

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main (int argc, char *argv[])
{pid_t pid = fork();if (pid == 0){while (1){printf("child running...\n"); sleep(1);}}else if (pid > 0){int i = 0;while (i++ < 6){printf("father running...\n"); sleep(1);}}else{printf("create failed\n");exit(0);}printf("Main exit()\n");return 0;
}

程序输出:

[root@localhost ~]# ./a.out
child running...
father running...
child running...
father running...
father running...
child running...
child running...
father running...
father running...
child running...
child running...
father running...
Main exit()
[root@localhost ~]# child running...
child running...
child running...
child running...
child running...

在Unix系统编程中,常常会碰到两个概念:僵死进程和孤儿进程。话说我以前曾经把这两个概念弄混淆过。

(3)什么是僵死进程?

我们知道,在Unix进程模型中,进程是按照父进程产生子进程,子进程产生子子进程这样的方式创建出完成各项相互协作功能的进程的。当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。如果父进程没有这么做的话,会产生什么后果呢?此时,子进程虽然已经退出了,但是在系统进程表中还为它保留了一些退出状态的信息,如果父进程一直不取得这些退出信息的话,这些进程表项就将一直被占用,此时,这些占着茅坑不拉屎的子进程就成为“僵死进程”(zombie)。系统进程表是一项有限资源,如果系统进程表被僵死进程耗尽的话,系统就可能无法创建新的进程。

(4)什么是孤儿进程?

孤儿进程是指这样一类进程:在进程还未退出之前,它的父进程就已经退出了,一个没有了父进程的子进程就是一个孤儿进程(orphan)。既然所有进程都必须在退出之后被wait()或waitpid()以释放其遗留在系统中的一些资源,那么应该由谁来处理孤儿进程的善后事宜呢?这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程“凄凉地”结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。

这样来看,孤儿进程并不会有什么危害,真正会对系统构成威胁的是僵死进程。那么,什么情况下僵死进程会威胁系统的稳定呢?设想有这样一个父进程:它定期的产生一个子进程,这个子进程需要做的事情很少,做完它该做的事情之后就退出了,因此这个子进程的生命周期很短,但是,父进程只管生成新的子进程,至于子进程退出之后的事情,则一概不闻不问,这样,系统运行上一段时间之后,系统中就会存在很多的僵死进程,倘若用ps命令查看的话,就会看到很多状态为Z的进程。严格地来说,僵死进程并不是问题的根源,罪魁祸首是产生出大量僵死进程的那个父进程。因此,当我们寻求如何消灭系统中大量的僵死进程时,答案就是把产生大量僵死进程的那个元凶枪毙掉(也就是通过kill发送SIGTERM或者SIGKILL信号啦)。

枪毙了元凶进程之后,它产生的僵死进程就变成了孤儿进程,这些孤儿进程会被init进程接管,init进程会wait()这些孤儿进程,释放它们占用的系统进程表中的资源,这样,这些已经“僵死”的孤儿进程就能瞑目而去了。

转载于:https://www.cnblogs.com/Robotke1/archive/2013/05/07/3065057.html

Linux产生僵尸进程和孤儿进程及区别相关推荐

  1. Linux 进程(一) 进程概念和进程状态(僵尸进程、孤儿进程、守护进程)

    进程的概念 进程状态 僵尸进程.孤儿进程.守护进程 进程的概念 程序:一系列有序的指令集合(就是我们写的代码) 进程:进程就是程序的一次执行,是系统进行资源分配和调度的独立单位. 程序是一个没有生命的 ...

  2. Linux系统编程--3(exec 函数族,僵尸进程和孤儿进程,wait和wait_pid回收子进程)

    exec 函数族 fork 创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支) ,子进程往往要调用一种 exec 函数以执行另一个程序.当进程调用一种 exec 函数时,该进程的用户 ...

  3. linux 僵尸进程deffunc,多进程-开启子进程的两种方式,查看进程的pid与ppid,僵尸进程与孤儿进程...

    一.开启子进程的两种方式 方式一: # 方式一: from multiprocessing import Process import time def task(name): print(" ...

  4. linux孤儿进程组深入理解,LInux下僵尸进程与孤儿进程是如何产生的?

    1:如何产生: 僵尸进程,先于父进程终止,但是父进程没有对其进行善后处理(获取终止子进程有关信息,释放它仍占有的资源).消灭僵尸进程的唯一方法是终止其父进程. 孤儿进程:该进程的父进程先于自身终止.其 ...

  5. linux进阶14——僵尸进程和孤儿进程

    1. 概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当一 ...

  6. 【Linux】进程概念——父子进程、僵尸进程和孤儿进程

    目录 父子进程 什么是父子进程? ==父子进程特性== 为什么有父子进程? 僵尸进程(defunct进程) 什么是僵尸进程? 僵尸进程的底层原因 僵尸进程的危害与解决方法 孤儿进程 什么是孤儿进程? ...

  7. linux waitpid实例,【Linux】僵尸进程,孤儿进程以及wait函数,waitpid函数(有样例,分析很详细)...

    本文内容: 1.僵尸进程,孤儿进程的定义,区别,产生原因,处理方法 2.wait函数,waitpid函数的分析,以及比较 背景:由于子进程的结束和父进程的运行是一个异步的过程,即父进程永远无法预测子进 ...

  8. 启动进程 问号_有两个这样的进程:僵尸进程amp;孤儿进程,蓝瘦香菇

    进程 先来说下什么是进程: 来看下百度是怎么说的: 光看说的不够形象,在windows系统中,它长这样: 在Mac系统中,它长这样: Linux中是这样的:(有点长截图一部分好了) [root@iz2 ...

  9. 什么是僵尸进程与孤儿进程

    1.什么是僵尸进程和孤儿进程: 在 Unix/Linux 系统中,正常情况下,子进程是通过父进程创建的,且两者的运行是相互独立的,父进程永远无法预测子进程到底什么时候结束.当一个进程调用 exit 命 ...

  10. 【Linux系统编程】特殊进程之孤儿进程

    00. 目录 文章目录 00. 目录 01. 孤儿进程概述 02. 孤儿进程代码 03. 附录 01. 孤儿进程概述 父进程运行结束,但子进程还在运行的子进程就称为孤儿进程(Orphan Proces ...

最新文章

  1. arcgis的python脚本-在ArcGIS中写python脚本读取shapefile
  2. *[hackerrank]Maximizing XOR
  3. td里面的内容加了br不起作用_刀圈TD黑暗游侠,最容易打金之一!!
  4. VTK:图表之RandomGraphSource
  5. subst命令镜像虚拟磁盘指南(原创)
  6. 数据导出生成word附件使用POI的XWPFTemplate对象
  7. OCFS2在Linux下配置文档
  8. java f.lenth返回值,这个是什么意思,求仔细说明
  9. 在webstorm中怎么配置本地服务器
  10. 使用Microsoft SQL Server 2000全文搜索功能构建Web搜索应用程序 --作者:Andrew B. Cencini...
  11. java接口自动化+博客园_java+接口自动化+eclipse之-----环境搭建
  12. eclipse不能添加tomcat7的问题
  13. 云存储软件行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  14. 凉了!张三同学没答好,熬夜整理最新大厂Java高频面试题
  15. 【代码保留】WebService发布本地磁盘信息
  16. bootstrap css div布局,从css源码理解bootstrap布局容器和栅格系统
  17. 前端项目部署到服务器
  18. Serverless 实战:3 分钟实现文本敏感词过滤
  19. yml文件配置数据库
  20. 19841227同生缘

热门文章

  1. 企业为什么要做高端网站优化呢?
  2. (转)使用Flexible实现手淘H5页面的终端适配
  3. MariaDB基础详解
  4. JFinal开发8个常见问题
  5. X3平台制程及工卡开立设计说明
  6. 【论文】Realtime lane tracking of curved local road 检测和跟踪功能
  7. 量化投资与信用风险机器学习建模
  8. Ubuntu 12.04 root默认密码? 如何使用root登录?
  9. C程序设计语言(第2版)简单读书笔记
  10. 访问 Confluence 6 的计划任务配置