(转载)Linux僵死进程的产生与避免

 (转载)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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php怎么查询数据库密码,如何验证php中的密码是通过mysql查询手动散列插入到数据库中的?...

有没有办法通过自己的散列方法插入mysql数据库的php验证密码&#xff1f;例如,如果我手动在表中插入用户数据,请假设用户表,如下所示&#xff1a;INSERT INTO users (email, pswd) VALUES (demoexample.com, SHA1(pass123));让我们假设mysql数据库中的哈希密码是&#xff1a;--…

(转)非极大抑制(Non-Maximum Suppression)

转载自非极大抑制&#xff08;Non-Maximum Suppression&#xff09;。 参考文章&#xff1a; 1. Non-Maximum Suppression for Object Detection in Python 2. NMS非极大值抑制 最近在做人脸识别的项目&#xff0c;其中在人脸检测算法中MTCNN算法是用到了NMS算法来筛选候选…

安装配置Eclipse开发PHP环境配置

文章结束给大家来个程序员笑话&#xff1a;[M] Eclipse发开PHP环境配置 首先准备好件软&#xff1a; 1. Apache,到这里找个最新本版 2. PHP&#xff0c;到这里下载 3. Eclipse IDE for Java EE Developers&#xff0c;到这里下载 4. DLTK Core Frameworks 1.0 Integration buil…

C++ 输入一行未知个数的整数

最近笔试的时候&#xff0c;编程题遇到这样要求的输入&#xff0c;需要输入一行整数&#xff0c;个数未知&#xff0c;然后整数之间用空格间隔&#xff0c;如下所示&#xff1a; 11 22 333 45 62 代码如下所示&#xff1a; int main() {vector<int> inputs;int n 0, …

mysql5.7.20中文,ubuntu16.04 mysql5.7.20表中插入中文顯示???的解決方法

打開配置文件&#xff1a;sudo gedit /etc/mysql/my.cnf在最下面添加&#xff1a;[client]default-character-setutf8[mysqld]character-set-serverutf8[mysql]default-character-setutf8保存暫停mysql服務&#xff1a;sudo /etc/init.d/mysql stop重啟mysql服務&#xff1a;su…

[原]好玩的Linux,关于时间cal命令

我们都知道&#xff0c;在Linux中&#xff0c;可以通过cal命令来查看日历。Cal怎么用呢&#xff0c;我们可以man一下&#xff0c;可以看到如下结果&#xff1a; 我们可以看到cal命令的基本用法如下&#xff1a;cal [-smjy13] [[[day] month] year] 当然如果不加指定参数的话&a…

python appium自动化测试平台开发,Python+Appium实现自动化测试

一、环境准备1.脚本语言&#xff1a;Python3.x IDE&#xff1a;安装Pycharm2.安装Java JDK 、Android SDK3.adb环境&#xff0c;path添加E:\Software\Android_SDK\platform-tools4.安装Appium for windows&#xff0c;官网地址http://appium.io/点击下载按钮会到GitHub的下载…

基于CNN的增量学习论文的读后感

最近在阅读几篇基于CNN的增量学习的论文。 《INCREMENTAL LEARNING WITH PRE-TRAINED CONVOLUTIONAL NEURAL NETWORKS AND BINARY ASSOCIATIVE MEMORIES》 09-19 阅读 第一篇论文是《INCREMENTAL LEARNING WITH PRE-TRAINED CONVOLUTIONAL NEURAL NETWORKS AND BINARY ASSOC…

Chrome浏览器兼容性 检测工具 (chrome插件)

近日 Google Chrome 组发起了浏览器兼容性检测工具(Chrome扩展)开源项目&#xff0c;能够自动检测网页中的兼容性问题。此工具已经实现了检测2010年9月Google在 Devfest北京会议上推出的w3help.org站点内所描述的部分兼容性问题。是前端兼容性工作必备辅助开发工具。 目前的版本…

卷积神经网络(CNN)介绍

简单介绍和总结卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;的基本组成网络层和常用的网络结构。 参考文章/书籍&#xff1a; An Intuitive Explanation of Convolutional Neural Networks对CNN中pooling的理解《深度学习轻松学&#xff1a;核心算法与…

CC2540低功耗的内幕

一、概述 1、BLE蓝牙协议栈结构 附图6 BLE蓝牙协议栈结构图 分为两部分&#xff1a;控制器和主机。对于4.0以前的蓝牙&#xff0c;这两部分是分开的。所有profile&#xff08;姑且称为剧本吧&#xff0c;用来定义设备或组件的角色&#xff09;和应用都建构在GAP或GATT之上。下面…

前端开发怎么用php,做web前端开发怎么样?

前端工程师是互联网时代软件产品研发中不可缺少的一种专业研发角色。从狭义上讲&#xff0c;前端工程师使用 HTML、CSS、JavaScript 等专业技能和工具将产品UI设计稿实现成网站产品&#xff0c;涵盖用户PC端、移动端网页&#xff0c;处理视觉和交互问题。从广义上来讲&#xff…

机器学习入门系列(1)--机器学习概览(上)

最近打算系统学习和整理机器学习方面的知识&#xff0c;会将之前看的 Andrew Ng 在 course 课程笔记以及最近看的书籍《hands-on-ml-with-sklearn-and-tf》结合起来&#xff0c;简单总结下机器学习的常用算法&#xff0c;由于数学功底有限&#xff0c;所以可能不会也暂时不能过…

[Google Code Jam] 2013-1A-C Good Luck 解法

问题的陈述在&#xff1a;https://code.google.com/codejam/contest/2418487/dashboard#sp2&a1&#xff0c; 官方的分析在&#xff1a;https://code.google.com/codejam/contest/2418487/dashboard#sa&a2。 这篇文章是结合官方的分析以及Dlougach的solution总结的解题思…

oracle 安装display,Linux安装Oracle 11时报错DISPLAY解决方案

在Linux上安装Oracle时&#xff0c;经常会报以下错误&#xff1a;无法使用命令 /usr/X11R6/bin/xdpyinfo 自动检查显示器颜色。请检查是否设置了DISPLA在Linux上安装Oracle时&#xff0c;经常会报以下错误&#xff1a;无法使用命令 /usr/X11R6/bin/xdpyinfo 自动检查显示器颜色…

机器学习入门系列(2)--机器学习概览(下)

这是本系列的第二篇&#xff0c;也是机器学习概览的下半部分&#xff0c;主要内容如下所示&#xff1a; 文章目录1. 机器学习的主要挑战1.1 训练数据量不足1.2 没有代表性的训练数据1.3 低质量的数据1.4 不相关的特征1.5 过拟合1.6 欠拟合2. 测试和评估3. 小结1. 机器学习的主要…