僵尸进程是如何产生的?

当进程调用fork()后,子进程运行完毕后,先行退出,父进程继续运行,这时候,操作系统维护着退出的子进程的信息,如cpu时间,内核时间,退出的状态等等,需要被他的父进程收集。此时,退出的子进程状态是僵尸状态,如果父进程有很多僵尸子进程的话,系统的性能可能会收到影响。这时候,父进程可以调用wait()或waitpid()函数来收集僵尸子进程,从而使僵尸进程消失。
如何避免僵尸进程的产生?
(1)      利用信号量。当一个子进程退出时,父进程会收到SIGCHLD信号,这个信号的默认处理方式是忽略。如果设置该信号的处理方式为SIG_IGN,当子进程退出时。将其状态丢掉,这样就不会产生僵尸进程了。
注意:
POSIX.1 并没有指定当SIGCHLD被忽略的行为,在4.4BSD和FreeBSD 5.2.1中,即使SIGCHLD被忽略,也会产生僵尸进程. Mac OS X 10.3, 则不会。对于SVR4而言, 如果signal()或者sigset()设置忽略SIGCHLD,则不会产生僵尸进程。Solaris 9和Linux 2.4.22与SVR4使用一样的策略。
如果我们使用sigaction(), 我们可以设置标志位SA_NOCLDWAIT为避免僵尸进程。FreeBSD 5.2.1, Linux 2.4.22, Mac OS X 10.3和Solaris 9都支持这个策略,为了可移植性,推荐这种策略。
(2)      Fork() twice。调用fork两次也可以避免僵尸进程的产生,apue上的例子:
        if ((pid = fork()) == 0) {
            /* first child */
            if ((pid = fork()) > 0)
                exit(0);/* 第二次fork的父进程,就是第一个子进程 */
            /*
             * 这里是第二个子进程,他的父进程已经是init进程了
             * 因为他本来的父进程已经exit(0)了(见上)
             */
            sleep(2);
            printf("second child, parent pid = %d/n", getppid());
            exit(0);
        }
        /* 等待第一个子进程退出,如果不等的话,还会有僵尸出现!*/
        if (waitpid(pid, NULL, 0) != pid)  
        err_sys("waitpid error");
         /* 继续父进程的工作 */
当父进程比子进程先行退出时,子进程将由init进程接管,init进程将负责回收其子进程(包括自己直接产生的和接管的)的状态。所以以下的代码是不会产生僵尸的:
         if ((pid = fork()) > 0) {
                exit(0);
             * 这里是第二个子进程,他的父进程已经是init进程了
             * 因为他本来的父进程已经exit(0)了(见上)
             */
            }
         else {
            /* 做子进程的工作,由于父进程先行退出,它将被init进程接管 */
        }

僵尸进程(zombie process)相关推荐

  1. linux僵尸程序,什么是僵尸进程(zombie)?

    僵尸进程是指一个已经终止.但是其父进程尚未对其进行善后处理获取终止进程的有关信息的进程,这个进程被称为"僵尸进程"(zombie). 怎样产生僵尸进程 一个进程在调用exit命令结 ...

  2. 僵尸进程zombie与孤儿进程orphan

    代码已上传至https://github.com/gatieme/AderXCoding/tree/master/system/unix/zombie 问题提出 以前在学习<unix环境高级编程 ...

  3. 查询php僵死进程,linux查找僵尸进程(zombie进程)

    首先,我们可以用top命令来查看服务器当前是否有僵尸进程,可以看到第二行行尾有个 0 zombie,如果数字大于0,那么意味着服务器当前存在有僵尸进程 可以用ps和grep命令寻找僵尸进程 ps -A ...

  4. linux defunct 进程,Linux僵尸进程(Zombie or defunct)

    僵尸进程(Zombie or defunct)关于Linux僵尸进程,一般是由于子进程结束的时候,会有一些资源没有释放掉,直到父进程结束或者由父进程去处理它才可以! www.cit.cn 僵尸进程就是 ...

  5. 如何察看僵尸进程 zombie

    其实这是系统维护每天必看的东西,都非常简单,也就是把平常使用的 ps -ef 多加一个l就可以看到更多详细的信息. top - 23:59:03 up 45 min,  6 users,  load ...

  6. 僵尸进程(zombie)以及避免方法

    僵尸进程在多进程环境下,父进程要长时间运行 ,期间可能创建子进程,然后子进程有 退出时,但是父进程还在运行,这时就产生了zombie进程.     子进程退出后,在进程表中还要占一项,并且子进程的一些 ...

  7. linux下的僵尸进程 - Zombie

    在linux中你可能进程听到有僵尸进程,那么究竟什么是僵尸进程,他又是怎样产生的呢?下面我们通过1个例子来说明一下. 我们知道退出一个进程用系统调用exit, 但是这并不意味着该进程马上就消失了,事实 ...

  8. Linux:僵尸进程 Zombie;waitpid

    文章目录 参考 僵尸进程的表象 出现僵尸进程的情况 一种产生Coredump,而磁盘空间不够用 一种父进程未有waitpid回收子进程 僵尸进程的影响 system 函数调用执行的子进程 waitpi ...

  9. c 僵尸进程_演示僵尸进程的C程序

    c 僵尸进程 僵尸进程 (Zombie process) A process which has finished its execution but still has an entry in th ...

  10. Linux 僵尸进程

    Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...

最新文章

  1. Java项目:基于SSM实现房屋租赁系统
  2. aop:aspectj-autoproxy /
  3. python交互窗口怎么才能不连着上一个程序_python实现启动一个外部程序,并且不阻塞当前进程...
  4. LQ训练营(C++)学习笔记_动态规划入门
  5. 在Kubernetes上使用Prometheus Operator监视应用程序
  6. 使用 bat 文件管理计算机服务
  7. 赣南师范学院数学竞赛培训第10套模拟试卷参考解答
  8. ssrs 级联参数_在SSRS中使用多值参数
  9. 注意numpy与pandas里std中的有偏和无偏
  10. C++中main函数的返回类型必须是int
  11. java线程系列一:Thread类中的start()方法与run方法
  12. 通达信经典指标组合图文详解
  13. 台式计算机音频插口,解决台式机电脑机箱前置音频插口(接口)不能使用一例.
  14. 【PyTorch】切记:GeForce RTX 3090 显卡仅支持 CUDA 11 以上的版本!
  15. jeecg微服务项目调用接口报错Token验证失效的解决方法
  16. 小米手机开启“启用MIUI优化”,导致Android Studio无法成功直接安装
  17. GTP(GPRS Tunnelling Protocol)协议http://blog.csdn.net/stephen_yin/article/details/6951237
  18. 内网渗透(九)之内网信息收集-手动本地信息收集
  19. 打表+dp思维+博弈
  20. 结构动力学MATLAB编程例题,华工结构动力学编程 MATLAB

热门文章

  1. 水星MW300R无线路由器无线网频繁掉线的解决方法除了重启路由还有???
  2. linux常用命令——ls
  3. TSINGSEE青犀视频平台人脸识别比对控制比对时间间隔的代码设计
  4. EasyClick 蓝奏云+石墨文档实现热更新
  5. php tcpdf 没有头部,TCPDF使用总结 - 从头笑到尾的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. [墨者学院] Windows硬盘文件分析取证(新建的用户名)
  7. Ubuntu16.04 桌面 launcher 丢失
  8. excel数据透视表:善用这些功能,提高工作效率!下篇
  9. 用java生成一个表白二维码
  10. 你真的会在阳光下拍照片么?