说起僵尸首先想到的林正英拍的那些僵尸鬼片,那些吸血、懂一些妖术、到处祸害人的可怕的东西。我的印象中有一种僵尸的说法就是:那些生前遭受到坏人的迫害,死后由于各种怨气、意念没有散去,最终没有到阎王那边报到的死人吧。
下面是一段从百度百科上面找到的一些有关僵尸的解释:
《阅微草堂笔记》把尸体成为僵尸的原因分成两项:新尸突变及葬久不腐。    养尸地 ,这较为科学。土壤土质酸碱度极不平衡,不适合有机物生长,因此不会滋生蚁虫细菌,尸体埋入即使过百年,肌肉毛发也不会腐坏,有些资料显示尸体的毛发,指甲会继续生长(其实是皮肤脱水后毛发和指甲根部外露造成的错觉)。风水学中亦有此一说。   (小时候听老人讲过:生于 红沙 日,死于黑沙日葬于飞沙地者就会成僵尸,“飞沙地” 即“土壤土质酸碱度极不平衡,不适合有机物生长之地”)   坊间流传道家有太阴炼形之法,尸体葬数百年,期满便会复生,新死的尸体被邪物/邪气附身,尸体吸收了阳气,借人生气而 尸变 ,人死之际,魂一散而魄滞。   袁枚《子不语》:人之魂善而魄恶,人之魂灵而魄愚,魄主宰人身,当魂离开人体,便会沦为恶鬼僵尸。
 
上面的这段话给我们三个知识:
                                    (1)僵尸就是人死后尸体由于土壤原因,没有腐烂。这个类似于木乃伊吧;
                                    (2)利用道家的一种法术可以让尸体埋葬超过百年后复活,复活后借助于新死的尸体存活;
                                    (3)《子不语》中的解释是人是由魂和魄两部分组成的。魂是人的聪明、善良的一面,魄是人的邪恶、愚笨的一面,魂主宰这人身,当魂离开人体以后就只剩下魄了,变成了恶鬼。
 
好了有关僵尸的讨论就到这里吧,之所以讨论僵尸是因为和我今天理解的linux中的“僵尸进程有关系”
所谓的僵尸进程:父进程fork一个子进程a,a运行结束后会释放大部分资源,如释放内核栈,递减文件描述符,文件系统的引用数,释放mm_struct结构等,但是会保留文件描述符,进程表中代表子进程表项的资源,虽然子进程不在运行,但是可以查到他的相关信息。
 
直到父进程正常终止,或者父进程调用wait时子进程才彻底释放资源。
 
呵呵,早上开始下雪了,瑞雪兆丰年。晚上还有年会……
接着上次的僵尸进程继续说吧:
  正常的情况应该是子进程执行完毕后,在父进程未执行wait()函数或者未执行完毕之前。这段时间子进程是出于僵尸状态的。
等父进程执行完毕或者调用wait完毕,子进程将彻底的释放资源,消逝。
 
下面是个测试程序:  正规的情况,父进程调用wait去等待子进程运行玩。在子进程未运行完毕之前,父进程调用wait一直出于阻塞状态。一旦子进程运行完毕,那么父进程立即执行wait。所以子进程几乎没有僵尸状态。呵呵……        

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

int main(void)

{

pid_t pid_a;

pid_a = fork();

int i = 0;

if(pid_a == 0)

{

while(i < 30)

{

printf("this is a children program\n");

i++;

sleep(1);

}

return 0;

}

else

{

printf("this is a father program\n");

wait(NULL);

return 0;

}

}

运行结果如下图:

子进程进入僵尸状态的原因是,子进程运行完毕后会留一些信息,告诉父进程自己是正常退出,还是非正常退出。但是父进程在子进程之前死了话,那么父进程在退出时内核中do_exit()会调用exit_notify()为子进程在当前的线程组中重新找一个父进程。如果找不到它的父进程就是init了,init会例行wait去处理僵尸进程。
 

把上面代码中的if(pid_a == 0)中pid_a ==0 改为pid_a !=0,注释掉wait(NULL)就会出现子进程的僵尸状态。如下图:

为了让父进程尽早的处理子进程的僵尸状态。当子进程推出前为父进程发送一个信号,那么父进程用wait回收就好了。这个是编程应该注意的。
 
不过我发现父进程先结束时,如果子进程的新父亲是init的话,init回收僵尸进程的速度是相当快得。呵呵,可见init 这个进程真是“僵尸的天敌”!(这块可以自己写个程序验证一下,记住别人说的不一定对)
 
编程中好的父进程应该是不做很多事情,专门用wait蹲点,一旦发现子进程变成“僵尸”就把他回收了,也就是说让父进程编程一个专业的僵尸杀手,要是父进程先于子进程之前死掉了,那么父进程就很遗憾扮演不了“僵尸杀手”的角色了。
 
说了这么多,目的就是让父进程扮演一个高效的“僵尸杀手”,不要让系统中出现太多的僵尸,那么社会也就和谐了。僵尸也不像人们传说中的那么可怕吧,对它越了解,你会发现它也很可爱。呵呵……

僵尸和僵尸进程的那些事相关推荐

  1. day34 并行并发、进程开启、僵尸及孤儿进程

    day34 并行并发.进程开启.僵尸及孤儿进程 1.并行与并发 什么是并行? 并行指的是多个进程同时被执行,是真正意义上的同时 什么是并发? 并发指的是多个程序看上去被同时执行,这是因为cpu在多个程 ...

  2. 植物大战僵尸java 僵尸_生存僵尸启示录:文字,路径和基本动画

    植物大战僵尸java 僵尸 本系列的第一篇文章介绍了SVG的基础知识,这是HTML5的一个被忽视,未被重视的方面. 尽管不同的浏览器以不同的方式实现SVG,但是上一指南介绍了如何创建文本,合并SVG图 ...

  3. 僵尸和孤儿进程及虚拟内存

    调研进程的调度算法. 根据系统的资源分配策略所规定的资源分配算法.对于不同的的系统和系统目标,通常采用不同的调度算法,例如,在批处理系统中,为了照顾为数众多的段作业,应采用短作业优先的调度算法:又如在 ...

  4. 僵尸java7723_僵尸王国7723游戏盒子

    僵尸王国7723盒子是一款超爽的僵尸射击游戏.僵尸王国7723盒子游戏里,玩家将与无数的丧尸展开斗智斗勇,轻松的扫射击溃敌人,获取大量金币. 游戏介绍 僵尸王国7723盒子是一款丧尸题材射击手游,僵尸 ...

  5. 10 Android 植物人大战僵尸-生成僵尸

    1. 效果 2. 需求 每隔一定的时间在5个跑道中随机生成僵尸,并且从右往左移动 3. 开发 定义一个僵尸生成管理者,负责定时生成僵尸,这里定义的是每隔15秒生成僵尸 package com.su.b ...

  6. 【CE入门教程】使用Cheat Engine(CE)修改游戏“植物大战僵尸”之僵尸篇

    目录 1.寻找僵尸位置基址 2.实现"秒杀"僵尸(修改僵尸血量) 上一期教程中,我们学习了修改植物大战僵尸的单卡片无CD.全卡片无CD.豌豆射手射速修改以及实现豌豆射手发射&quo ...

  7. 你知道Linux里D进程会搞事吗?

    前言 这篇文章是一位大神在实际项目中遇到问题并分析总结出来的,作为新手,能接触到这类文章应该是受益匪浅,这位同学现在在魅族工作,以后也会一直在魅族工作,是Linux 方面的专家,「魅族还有另一个Lin ...

  8. Linux的僵尸进程

    僵尸进程的简单理解 linux中有几种进程状态,其中有一种特殊就是僵尸进程,个人理解是可以这样理解,就是我们 的子进程已经退出了,但是子进程退出了之后无家可归,就是一个飘移的孤魂野鬼一样,所以形象的取 ...

  9. c语言如何不产生僵尸进程,第三章 九析带你处理 zombie(defunct) 进程

    目录 1 前言 2 僵尸进程 2.1 进程简介 2.2 僵尸进程例子 2.3 僵尸进程危害 3 处理僵尸进程 3.1 kill 命令 3.2 kill 父进程 3.3 reboot 3.4 magic ...

最新文章

  1. Vupsen, Pupsen and 0 思维,凑系数
  2. newcode wyh的吃鸡(优势队列+BFS)题解
  3. C#数据结构-双链表
  4. a*算法matlab代码_MATLAB数学建模算法的代码模板大全
  5. 多版本Python共存的配置和使用
  6. Atitit 常见聚合运算与算法 目录 1.1. 单行函数,vs 那就是聚合函数 1 1.2. 聚合分类 哈希聚合 标量聚合 流聚合 1 1.3. 常见聚合函数 mysql oracle等 1 r
  7. android模拟拍照,Android调用系统相机拍照,并且模仿实现水印相机简单功能
  8. epoch - iteration - batch
  9. 红楼梦人物关系图,一代大师成绝响,下回分解待何人,kindle读书摘要
  10. 如何查看电脑的操作系统以及更改计算机名称
  11. 笔记本电脑黑屏 笔记本开机黑屏 笔记本黑屏怎么办
  12. Pg报错: HikariPool-1 - Connection is not available, request timed out after 30040ms.问题处理
  13. 2022-2027年中国海洋油气开采行业市场全景评估及发展战略规划报告
  14. 11套宝藏特效视频素材大约263GB 免费分享
  15. hp喷墨打印机加连供的处理
  16. android电话拦截
  17. mac anaconda 安装 opencv2 python3.6
  18. MT7686芯片资料
  19. 代理服务器(Proxy)完全解析
  20. 建设企业的数据化引擎,网易严选数据中台的经验和方法论

热门文章

  1. Unity工程代码规范检测工具
  2. C#Winform的DataGridView控件使用详解1—七种DataGridViewColumn类型使用方法
  3. 【以太坊开发06】Truffle开发入门
  4. 在B站推广二次元手游
  5. 苹果称一矿泉水公司所申请 Logo 跟自家的太像
  6. git规范化提交 git cz
  7. Vuex 之一:3种拿到 state 中数据的方式与实例剖析
  8. Python 15大框架、操作系统 linux的发行版有多少
  9. 矩阵生发java_Java实现任意矩阵Strassen算法
  10. 从海量手机号中匹配某一个手机号