Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态。例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止。如果子进程已经终止,那么,它的终止代号将告诉父进程这个任务是否已成功地完成。

为了遵循这些设计原则,不允许 Linux 内核在进程一终止后就丢弃包含在进程描述符字段中的数据。只有父进程发出了与被终止的进程相关的 wait() 类系统调用之后,才允许这样做。这就是引入僵死状态的原因:尽管从技术上来说进程已死,但必须保存它的描述符,直到父进程得到通知。

如果一个进程已经终止,但是它的父进程尚未调用 wait() 或 waitpid() 对它进行清理,这时的进程状态称为僵死状态,处于僵死状态的进程称为僵尸进程(zombie process)。任何进程在刚终止时都是僵尸进程,正常情况下,僵尸进程都立刻被父进程清理了。

僵尸进程是如何产生的

为了观察到僵尸进程,我们自己写一个不正常的程序,父进程 fork 出子进程,子进程终止,而父进程既不终止也不调用 wait 清理子进程:

#include

#include

#include

int main(void)

{

int i = 100;

pid_t pid=fork();

if(pid < 0)

{

perror("fork failed.");

exit(1);

}

if(pid > 0)

{

printf("This is the parent process. My PID is %d.\n", getpid());

for(; i > 0; i--)

{

sleep(1);

}

}

else if(pid == 0)

{

printf("This is the child process. My PID is: %d. My PPID is: %d.\n", getpid(), getppid());

}

return 0;

}

把上面的代码保存到文件 zomprocdemo.c 文件中,并执行下面的命令编译:

$ gcc zomprocdemo.c -o zomprocdemo

然后运行编译出来的 zomprocdemo 程序:

$ ./zomprocdemo

此时子进程已经退出,但是父进程没有退出也没有通过 wait() 调用处理子进程。我们使用 ps 命令查看进程的状态:

上图红框中的大写字母 “Z” 说明 PID 为 112712 的进程此时处于僵死的状态。

让我们接着往下看!在结束 sleep 后父进程退出。当父进程退出后,子进程会变成孤儿进程,此时它会被一个管理进程收养。在不同的系统中,这个管理进程不太一样,早期一般是 init 进程,Ubuntu 上是 upstart,还有近来的 Systemd。但是它们都完成相同的任务,就是 wiat() 这些孤儿进程,并最终释放它们占用的系统进程表中的资源。这样,这些已经僵死的孤儿进程就彻底的被清除了。

僵尸进程的危害

在进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号 PID,退出状态 the termination status of the process,运行时间 the amount of CPU time taken by the process 等)。直到父进程通过 wait / waitpid 来取时才释放。

如果进程不调用 wait / waitpid 的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。

如何处理僵尸进程

僵尸进程的产生是因为父进程没有 wait() 子进程。所以如果我们自己写程序的话一定要在父进程中通过 wait() 来避免僵尸进程的产生。

当系统中出现了僵尸进程时,我们是无法通过 kill 命令把它清除掉的。但是我们可以杀死它的父进程,让它变成孤儿进程,并进一步被系统中管理孤儿进程的进程收养并清理。

下面的 demo 中,父进程通过 wait() 等待子进程结束:

#include

#include

#include

#include

#include

int main(void)

{

pid_t pid;

pid = fork();

if (pid < 0)

{

perror("fork failed");

exit(1);

}

if (pid == 0) {

int i;

for (i = 3; i > 0; i--)

{

printf("This is the child\n");

sleep(1);

}

// exit with code 3 for test.

exit(3);

}

else

{

int stat_val;

wait(&stat_val);

if (WIFEXITED(stat_val))

{

printf("Child exited with code %d\n", WEXITSTATUS(stat_val));

}

}

return 0;

}

demo 中父进程不仅等待子进程结束,还通过 WEXITSTATUS 宏取到了子进程的 exit code。

https://www.cnblogs.com/sparkdev/tag/Linux/default.html

java 僵尸进程_Linux 僵尸进程相关推荐

  1. linux 守护进程_Linux 守护进程

    前言 Linux 平台下,经常需要程序脱离终端在后台运行,很多程序在启动的时候需要加 -d 参数,这一般代表以守护进程(后台进进程)的方式启动.那么怎么启动守护进程呢? 创建方式 //程序退出的默认动 ...

  2. c++ 隐藏进程_Linux 查看进程的动态信息

    前言 top命令经常用来监控Linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况 目录 一.描述 二.top命令常用字段含义 三.top中的子命令 四.总结 五.思维导 ...

  3. linux QT 结束当前进程_Linux结束进程到底有多少种方法?

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习. 1. 前言 我们经常在Linux里使用kill命令来结束某后台进 ...

  4. linux java 僵尸进程_Linux 系统中僵尸进程

    Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类似,虽然已经死了,但是由于没人给它们收尸,还能四处走动.僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸.配图源 ...

  5. JAVA项目linux僵尸进程_linux杀死僵尸进程

    ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9 1.查看系统是否有僵尸进程 使用Top命 ...

  6. linux里面有mysql的僵尸进程_Linux的僵尸进程处理1

    Linux中有两种异常的进程: 1.孤儿进程:应用通过fork进程后,父进程被kill或者exit,该父进程的子进程被1号进程接管.linux内核启动时候回启动0号进程,启动完毕后0号进程就处于空闲状 ...

  7. java 僵尸进程_孤儿进程与僵尸进程

    开发中,在io密集型的场景下,我们可以使用多进程(多线程/协成更nber)来提高任务的处理速度.这就需要主进程需要等待所有工作进程执行完毕后才可以去汇总结果后退出. 但如果不规范的编写程序,就可能导致 ...

  8. linux里面有mysql的僵尸进程_linux 如何清理僵尸进程

    定义 In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for ...

  9. linux mysql 僵尸进程_Linux 系统中僵尸进程

    Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类似,虽然已经死了,但是由于没人给它们收尸,还能四处走动.僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸. 僵尸 ...

最新文章

  1. 了解这4个重点,带你探索未来将如何设计智能系统和机器人!
  2. 美多商城之用户注册(用户模型类)
  3. 用VIM打造C语言编写器
  4. dbeaver连接mysql 驱动jar_用Intellij Idea创建一个普通的Java工程并用JDBC连接数据库...
  5. VS 2010 开发 ActiveX 开始篇
  6. 大学每天打游戏,不是混吃等死是什么?
  7. Linux环境下搭建Tomcat+mysql+jdk
  8. functools.partial
  9. Python-面向对象之一
  10. 中国科学院微电子学院计算机,周云燕 - 中国科学院大学 - 微电子学院
  11. 微信小程序:独立后台带分销功能月老办事处交友盲盒
  12. python人员管理系统_python实例_员工管理系统
  13. meterpreter下抓取windows系统明文密码实验
  14. 【牛客刷题-SQL进阶挑战】NO5.窗口函数
  15. MySQL#在指定的列中添加数据
  16. 西北农林科技大学计算机类到底咋样,为了去读985,西北农林科技大学值得选择吗?...
  17. php网上交友系统,解决方案-PHP交友程序_交友源码_征婚交友系统- OELOVE官方网站...
  18. The application could not be installed: INSTALL_FAILED_TEST_ONLY
  19. Acrel-2000Z电力监控系统在某区块页岩气地面集输工程中的应用分析
  20. pip list 后出现“warning:Ignoring invalid distribution -orch”

热门文章

  1. 春节福利:《Oracle性能优化与诊断案例精选》电子版首次公开下载
  2. 一篇文章带你读懂 MySQL 和 InnoDB
  3. “七大属性加持,三个全新升级组件”这个高性能利器有点厉害
  4. 基于DAYU的实时作业开发,分分钟搭建企业个性化推荐平台
  5. 解析:区块链的本质是伴随信息社会产生的一种新型生产关系
  6. java csv 单元格格式_java导出csv格式文件的方法
  7. Android笔记 采用httpclient提交数据到服务器demo
  8. 2021c语言教程,全国计算机等级考试二级教程——C语言程序设计(2021年版)
  9. 火狐浏览器linux最新版本下载,Firefox9 for Linux下载
  10. PyCharm双击或默认情况下是插入的输入状态解决方法