僵尸进程(zombie process)
首先了解一下linux中进程的5大状态:
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
D Uninterruptible sleep (usually IO)
T Stopped, either by a job control signal or because it is being traced.
Z Defunct ("zombie") process, terminated but not reaped by its parent.
状态转换关系图:
僵尸进程是指一个已经结束运行,但是其父进程尚未对其进行善后处理的进程。那么为什么一个进程结束运行之后,父进程要对它进行善后处理呢?善后处理做了什么事呢?
具体来说就是,一个进程结束运行之后,该进程并没有被彻底销毁,内核仍然为该进程维护了一些信息(进程ID、该进程的终止状态以及该进程使用的CPU时间总量)。父进程可以通过调用wait()/waitpid()来获取这些信息,并最终销毁该进程。
如何避免僵尸进程的产生呢?
1. 父进程通过调用wait()/waitpid()等待子进程结束。(这会导致父进程被挂起)
2. 如果父进程很忙,不想被挂起,可以通过signal函数设置SIGCHLD信号的handler,在handler中调用wait()/waitpid()。
(子进程结束时,内核会向父进程发送SIGCHLD信号,父进程对该信号的默认处理是忽略。)
3. 父进程通过signal(SIGCHLD, SIG_IGN)显示忽略SIGCHLD信号,这样子进程结束后,内核不在向父进程发送SIGCHLD信号,内核负责回收子进程。
4. 两次fork()。
父进程fork()出子进程,子进程fork()出孙进程后退出,孙进程结束运行后,由于其父进程已经退出,因此由init进程接管。init进程会负责该进程的销毁工作。
如何清除僵尸进程呢?
kill命令无法杀死僵尸进程,但是我们可以kill僵尸进程的父进程,这样僵尸进程就会变成孤儿进程,然后由init进程接管。
僵尸进程(zombie process)的更多相关文章
- linux 杀掉僵尸进程 (zombie process, defunct)
本文说明为什么会出现僵尸进程 (zombie process, defunct),以及如何杀掉僵尸进程 1. 为什么有僵尸进程 僵尸进程出现在父进程没有回收子进程的 PCB 的时候,这个时候子进程已经 ...
- Linux 僵尸进程查杀
僵尸进程概念 僵尸进程(Zombie process)通俗来说指那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸. 书面形式一点:一个进程结束了,但是他的父进程没有等待(调用wait ...
- Linux 僵尸进程
Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...
- Linux 僵尸进程如何处理
Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...
- 并发编程(二)--利用Process类开启进程、僵尸进程、孤儿进程、守护进程、互斥锁、队列与管道
一.multiprocessing模块 1.multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似. 2.mu ...
- 并发编程(二)——利用Process类开启进程、僵尸进程、孤儿进程、守护进程、互斥锁、队列与管道
Process类与开启进程.守护进程.互斥锁 一.multiprocessing模块 1.multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模 ...
- 僵尸进程的产生和避免,如何kill杀掉linux系统中的僵尸defunct进程
在 Unix系统管理中,当用ps命令观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓的"僵尸"进程."僵尸"进程是一个早已 死亡的进程 ...
- [Linux] 孤儿进程与僵尸进程[总结]
转载: http://www.cnblogs.com/Anker/p/3271773.html 1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两 ...
- <转载>僵尸进程
转载http://www.cnblogs.com/scrat/archive/2012/06/25/2560904.html 什么是僵尸进程 僵尸进程是指它的父进程已经退出(父进程没有等待(调用wai ...
随机推荐
- 浅谈ArrayList
浅谈ArrayList 废话不多说(事实是不会说),让我们直接进入正题 首先讲一讲最基本的ArrayList的初始化,也就是我们常说的构造函数,ArrayList给我们提供了三种构造方式,我们逐个来查 ...
- 如何提高你使用windows的逼格(windows用成Linux的赶脚)
一.准备工作 作为一个整洁而有内涵的人,电脑桌面一定要清洁 二.桌面整洁了,软件怎么打开呢? 方案一 方案二.敲重点 我们可以使用终端指令打开windows安装的任意软件: 打开Windo ...
- BFC的理解与应用
什么是BFC(Block formatting contexts) BFC的通俗理解: 首先BFC是一个名词,是一个独立的布局环境,我们可以理解为一个箱子(实际上是看不见摸不着的),箱子里面物品的摆放 ...
- 传智博客2015年最新版iOS基础视频_最适合初学者入门
视频介绍: 本视频是iOS学院精心录制的免费精华版iOS语言基础视频,该视频特点在于最大程度保证了知识点的完整性,按知识点进行视频录制,每个视频控制在20分钟左右,不会使学生产生疲劳,授课讲究通俗易懂 ...
- 2019-07-28【机器学习】无监督学习之聚类 DBSCAN方法及其应用 (在线大学生上网时间分析)
样本: import numpy as np import sklearn.cluster as skc from sklearn import metrics import matplotlib.p ...
- stand up meeting 11/16/2015
第一周,熟悉任务中~ 大致写下一天的工作: 冯晓云:熟悉bing接口,本意是调在线的必应词典API,参阅了大量C#调用API开发.net的工作,[约莫是因为有个窗口互动性更强,所以这样的工作更有趣,也 ...
- CTF中的命令执行绕过
本位原创作者:Smity 在介绍命令注入之前,有一点需要注意:命令注入与远程代码执行不同.他们的区别在于,远程代码执行实际上是调用服务器网站代码进行执行,而命令注入则是调用操作系统命令进行执行. 作为 ...
- Java 8 到 Java 14,改变了哪些你写代码的方式?
前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...
- python3购物车
python3实现购物车小程序,优化后将程序分成函数,用文件注册和验证用户名密码. #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 20 ...
- python函数-易错知识点
定义函数: def greet_users(names): #names是形参 """Print a simple greeting to each user in th ...