(转载)http://blog.chinaunix.net/uid-23089249-id-210808.html

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

一、僵死进程的产生
    在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等,但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the
termination status of the process,运行时间the amount of CPU time taken by the process等), 直到父进程通过wait/waitpid来取时才释放。此时该进程处于僵死状态,该进程成为僵死进程(Zombie Process)。 这保证了父进程可以获取到子进程结束时的状态信息。
    在Linux进程的状态中,僵死进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵死进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵死状态,如果这时父进程结束了,僵死的子进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵死进程,它产生的所有僵死进程也跟着消失(每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管他,成为他的父进程)。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵死状态,这就是为什么系统中有时会有很多的僵死进程。怎么查看僵死进程,利用命令ps,可以看到有标记为Z的进程就是僵死进程。

二、僵死进程的危害
    如果父进程不调用wait/waitpid的话, 那么保留的那段信息就不会释放,其进程号会一定被占用,但是系统所能使用的进程号是有限的,如果产生了大量的僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。

三、僵死进程的避免
1、父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起
2、如果父进程很忙,那么可以用signal函数为SIGCHLD安装信号处理函数。子进程结束后,父进程会收到该信号,可以在信号处理函数中调用wait回收 。
3、如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程
发送信号。
或用sigaction函数为SIGCHLD设置SA_NOCLDWAIT,这样子进程结束后,就不会进入僵死状态
 struct sigaction sa;
 sa.sa_handler = SIG_IGN;
 sa.sa_flags = SA_NOCLDWAIT;
 sigemptyset(&sa.sa_mask);
 sigaction(SIGCHLD, &sa, NULL);
4、fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要父进程来做。

    int nStatus; pid_t pid;pid = vfork();            //生成子进程if (pid > 0)            //父进程
    {waitpid(pid, &nStatus, 0);    //等待子进程结束,否则子进程会成为僵死进程,一直存在,即便子进程已结束执行
}else if (0 == pid)        //子进程
    {pid = vfork();        //生成孙进程if (pid > 0) {exit(0);        //子进程退出,孙进程过继给init进程,其退出状态也由init进程处理,与原有父进程无关
        }else if (0 == pid)    //孙进程
        {if (execlp("ls", "ls", NULL) < 0){perror("execlp");exit(-1);}}else{ perror("vfork(child)"); } }else{ perror("vfork(parent)"); } 

转载于:https://www.cnblogs.com/Robotke1/archive/2013/05/01/3053716.html

(转载)Linux僵死进程的产生与避免相关推荐

  1. linux 僵死进程及其处理方法

    一.什么是僵死进程? 一般情况下,程序调用exit(包括_exit和_Exit,它们的区别这里不做解释),它的绝大多数内存和相关的资源已经被内核释放掉,但是在进程表中这个进程项(entry)还保留着( ...

  2. linux僵死进程的产生与避免

    http://blog.chinaunix.net/uid-23089249-id-210808.html 一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁, 而是留下一个称为 ...

  3. linux僵死进程是什么,linux进程僵死

    如果Linux系统的ECS实例CPU持续保持高使用率,则会对系统稳定性和业务运行造成影响.可以按如下步骤进行处理. 定位问题.找到影响CPU使用率过高的具体进程. 分析处理.查看影响CPU使用率过高的 ...

  4. Linux 僵死进程 文件操作

    目录 复制进程:fork() 习题一: 习题二 习题三 习题四 僵死进程 test.c 解决方法wait 法一 法二 文件描述符 文件操作 open read write close open.c 写 ...

  5. Linux——僵死进程

    1.僵死进程产生的原因或者条件? 当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程. 当一个进程结束时,进程实体先被释放,因为PCB中的exit_code记录进程的退出码, ...

  6. linux 检查僵死进程,Linux僵死进程查看和解决

    最近工作过程中,发现好几台服务器出现僵死进程(如图). 用下面的命令找出僵死进程 ps-A-ostat,ppid,pid,cmd|grep-e'^[Zz]' 命令注解: -A参数列出所有进程 -o自定 ...

  7. linux 僵死日志,linux 僵死进程及处理

    =========================================== defunct 进程只是在process table里还有一个记录,其他的资源没有占用,除非你的系统的proce ...

  8. java中的僵死进程_Java中线程间怎么通讯?什么叫僵死线程?

    <尸家保镖> <猛鬼出千> <不死心灵> <大家发财> <灵幻少女> <九天玄女> <僵尸至尊> <湘西尸王& ...

  9. linux+守护进程+php,【转载】Linux 守护进程的编程方法

    [转载]Linux 守护进程的编程方法 原文见: http://www.linuxdevelop.org/tingxx/show.php?table=c&id=3 Linux 守护进程的编程方 ...

最新文章

  1. excel表格最大行数
  2. 模p加法和模p乘法学习
  3. 最优化评分法c语言,最优化方法及其实现(Optimization-Algorithm)C语言
  4. guid oracle 生成不重复_可空类型和Guid的使用
  5. java是什么格式_是java格式
  6. mysql排列组合实现_Java实现数列的排列组合
  7. 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)
  8. LeetCode 2049. 统计最高分的节点数目(DFS)
  9. linux定时监控端口并重新启动shell脚本命令
  10. 【CCF】201609-2火车购票
  11. WCF创建Rest服务(附:.net2.0创建Rest服务)
  12. Java求解迷宫问题:栈与回溯算法
  13. Oracle DB_LINK如何使用
  14. 拓端tecdat|R语言Fama French (FF) 三因子模型和CAPM多因素扩展模型分析股票市场投资组合风险/收益可视化
  15. MySQL binlog_format (Mixed,Statement,Row)
  16. 需求分析——基于Django框架的天天生鲜电商网站项目系列博客(一)
  17. 2017嵌入式软件行业现状及概述
  18. 纵横职场20条黄金法则,知人善用的五个标准,李嘉诚14句经典财富格言
  19. 对视频文件进行简单的加密
  20. c++ 的vector、array和数组的比较

热门文章

  1. WebM VP8 SDK Usage/关于WebM VP8 SDK的用法
  2. 开源一个爬取redmine数据的测试报告系统
  3. 《面向对象分析与设计》一第2章 什么是面向对象分析
  4. JS进阶之---函数,立即执行函数
  5. Android两种常见错误(ANR和FC)解决办法
  6. spring集成struts2
  7. 企业员工工资管理系统
  8. Oracle服务器连接
  9. Fast Image Cache – iOS 应用程序高性能图片缓存
  10. 出了本练内功的书:《完美软件开发:方法与逻辑》