文章目录

  • 僵尸进程概念
  • 僵尸进程问题及危害
  • 实现一个僵尸进程
  • 僵尸进程处理
  • 僵尸进程的预防
    • (1)通过信号机制
    • (2)Fork 两次

僵尸进程概念

在 unix/linux 中,正常情况下,子进程是通过父进程创建的。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。当一个进程完成它的工作终止之后,它的父进程需要调用 wait()
或者 waitpid()系统调用取得子进程的终止状态。

僵尸进程:一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死(zombie)进程。

僵尸进程问题及危害

unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息,就可以得到。

这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。

但是仍然为其保留一定的信息(包括进程号 the process ID,退出状态 the termination status of the process,运行时间 the amount of CPU time taken by the process 等)。直到父进程通过 wait / waitpid 来取时才释放。

但这样就导致了问题,如果进程不调用 wait / waitpid 的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。

实现一个僵尸进程

详细内容请移驾另一篇博客:
https://yangyongli.blog.csdn.net/article/details/118738169

僵尸进程处理

我们知道僵尸进程是不能通过 kill 命令来终止的,想要处理系统中的僵尸进程,只能找到产生僵尸进程的父进程,使用 kill 命令终止父进程即可。此时僵尸进程成为孤儿进程,会被 init 进程接管,调用 wait 函数释放资源。

僵尸进程的预防

(1)通过信号机制

子进程退出时向父进程发送 SIGCHILD 信号,父进程处理 SIGCHILD 信号。
在信号处理函数中调用 wait 进行处理僵尸进程。测试程序如下所示

通过信号量及时发现了僵尸进程并处理了。

/*************************************************************************> File Name: main.c> Author: 杨永利> Mail: 1795018360@qq.com > Created Time: 2021年07月14日 星期三 21时54分29秒************************************************************************/#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <signal.h>static void sig_child(int signo);int main()
{pid_t pid;//创建捕捉子进程退出信号signal(SIGCHLD, sig_child);pid = fork();if (pid < 0){perror("fork error:");exit(1);}else if (pid == 0){printf("I am child process,pid id %d.I am exiting.\n",getpid());exit(0);}printf("I am father process.I will sleep two seconds\n");//等待子进程先退出sleep(2);//输出进程信息system("ps -o pid,ppid,state,tty,command");printf("father process is exiting.\n");return 0;
}static void sig_child(int signo)
{pid_t pid;int stat;//处理僵尸进程while ((pid = waitpid(-1, &stat, WNOHANG)) > 0)printf("child %d terminated.\n", pid);
}

(2)Fork 两次

《Unix 环境高级编程》8.6 节说的非常详细。原理是将子进程成为孤儿进程,从而其的父进程变为 init 进程,通过 init 进程可以处理僵尸进程。测试程序如下所示:

/*************************************************************************> File Name: main.c> Author: 杨永利> Mail: 1795018360@qq.com > Created Time: 2021年07月14日 星期三 22时08分39秒************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main()
{pid_t pid;//创建第一个子进程pid = fork();if (pid < 0){perror("fork error:");exit(1);}//第一个子进程else if (pid == 0){//子进程再创建子进程printf("I am the first child process.pid:%d\tppid:%d\n", getpid(), getppid());pid = fork();if (pid < 0){perror("fork error:");exit(1);}//第一个子进程退出else if (pid > 0){printf("first procee is exited.\n");exit(0);}//第二个子进程//睡眠 3s 保证第一个子进程退出,这样第二个子进程的父亲就是 init 进程里sleep(3);printf("I am the second child process.pid: %d\tppid:%d\n", getpid(), getppid());exit(0);}//父进程处理第一个子进程退出if (waitpid(pid, NULL, 0) != pid){perror("waitepid error:");exit(1);}exit(0);return 0;
}

Linux僵尸进程详解相关推荐

  1. 转:Linux 僵尸进程详解

    Linux 僵尸进程详解 转载:http://www.51testing.com/?uid-225738-action-viewspace-itemid-206225 1.僵尸进程概念: 僵尸进程(Z ...

  2. linux 前后台进程详解

    前后台进程切换-nice 进程优先级 -free -实战 screen 后台执行命令 linux 前台进程与后台进程的区别: 进程的前台与后台运行 跟系统任务相关的几个命令: 注:实际生产环境中,都是 ...

  3. linux系统编程之进程(八):守护进程详解及创建,daemon()使用

    linux系统编程之进程(八):守护进程详解及创建,daemon()使用 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等 ...

  4. Linux进程详解 【Linux由基础到进阶】

    Linux进程详解 进程的概念: 虚拟处理器: 虚拟内存: 进程的产生 进程的管理 进程描述符 分配进程描述符 进程描述符的存放 进程的状态 设置进程状态 进程上下文 系统调用与库函数的区别 进程家族 ...

  5. Linux进程详解(二)完结

    原创架构师之路2019-08-13 22:08 接Linux进程详解(一) 4. 进程运行 程序运行时大部分进程状态为运行或睡眠.调度算法解决可以跑的运行状态(就绪和运行),剩下的不可以跑的进程就是睡 ...

  6. linux top命令 动态查看进程详解

    文章目录 linux top命令 动态查看进程详解以及使用方法 top命令的输出,可分为上下两个部分 上面部分:整个系统的资源的使用状态 下面部分:单个进程的资源使用状态 上面部分详解: 第一行:由三 ...

  7. Linux系统守护进程详解

    文中有不对或者有不清楚的地方,请大家告诉我,谢谢!   Linux系统守护进程详解 不要关闭下面这几个服务: acpid, haldaemon, messagebus, klogd, network, ...

  8. linux bsd命令,linux ps命令详解(BSD风格)

    linux ps命令详解(BSD风格) linux中ps只显示进程的静态快照,及瞬间的进程状态,它拥有众多的风格,可分为3组:UNIX风格,BSD风格,GNU风格,本文介绍BSD风格的ps指令. 参数 ...

  9. linux下wait函数,Linux wait函数详解

    wait和waitpid出现的原因 SIGCHLD --当子进程退出的时候,内核会向父进程SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) --子进程退出时,内核将 ...

  10. linux top命令看磁盘,linux top命令详解

    linux top命令详解 下面详细介绍它的使用方法. top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48 Tasks: 29 ...

最新文章

  1. 华人首位!清华学子尤洋 荣升新加坡国立大学“校长青年教授”
  2. python安装系统要求_python需要什么系统 | window重装系统教程
  3. oracle监听静态注册,oracle监听器动态注册于静态注册的区别
  4. Yarn application has already ended! It might have been killed or unable to launch application master
  5. AbsListView.LayoutParams
  6. word List 07
  7. ubuntu自定义安装里怎么选_超市里的五香粉怎么选?看懂配料表,两个小技巧,不怕选不好。...
  8. html中可以有两个h1,在一个HTML中h1标签能出现几次?h1标签和标题标签
  9. DB2 删除某用户下的所有表
  10. winform调用websocket_C#基于websocket的前台及后台实时推送
  11. 专访徐勇州:腾讯云全球化布局势如破竹,构建全球24小时无差别服务︱大咖访谈录...
  12. git 查看修改明细_git查看某个文件的修改历史
  13. Improving your productivity in the Visual Studio Editor
  14. C++自增和自减运算符(--和++)
  15. python如何下载os库_python下载os库的方法
  16. 优质的vray视频教程素材推荐,不容错过
  17. CodeBlock:Process terminated with status1073741510
  18. 科研必备 | 谷歌学术高级搜索详解
  19. c 语言 农历,C++算法系列之中国农历的算法
  20. Xposed模块初体验——第一篇

热门文章

  1. arcgis重心迁移分析_ArcGIS支持下三峡库区适度人口重心迁移研究
  2. word参考文献插入和上标设置
  3. iOS 在CollectionView上做展开收起动画
  4. js生成java uuid_javascript 生成UUID
  5. Zipf齐夫分布及Java实现
  6. 全世界国家中英文名称以及地区区号json格式【资源】
  7. matlab对样本方差区间估计,已知样本均值和样本方差做区间估计
  8. 常见的网上商城系统开发语言有哪些?
  9. 【Flask+SocketIO】如何用Flask做一个快捷迷你的局域网聊天室
  10. 从零到无学单片机——画原理图、PCB