老男孩教育专注IT教育10余年,只培养IT技术精英

全国免费咨询电话(渠道合作):400-609-2893

Linux中产生zombie的原因详解!

老男孩IT教育

常见问题

2023年1月31日 17:49

zombie英文全称是zombie process,中文名为僵尸进程,也就是死掉的进程,那么Linux中产生zombie的原因是什么?具体内容请看下文。

  zombie英文全称是zombie process,中文名为僵尸进程,也就是死掉的进程,那么Linux中产生zombie的原因是什么?具体内容请看下文。

Linux培训机构

  僵尸进程,英文名zombie process,顾名思义就是死掉的进程。

  僵尸进程产生的原因就是父进程产生子进程后,子进程先于父进程退出,但是父进程由于种种原因,并没有处理子进程发送的退出信号,那么这个子进程就会成为僵尸进程。

  这个是所谓的zombie是指在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程,僵尸进程成为孤儿进程,过继给1号进程init,init始终会负责清理僵尸进程。

  僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程

  解决方法:

  1、父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。执行wait()或waitpid()系统调用,则子进程在终止后会立即把它在进程表中的数据返回给父进程,此时系统会立即删除该进入点。在这种情形下就不会产生defunct进程。

  2、如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler。在子进程结束后,父进程会收到该信号,可以在handler中调用wait回收。

  3、如果父进程不关心重点内容子进程什么时候结束,那么可以用signal(SIGCLD, SIG_IGN)或signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号。

  4、fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。

  老男孩教育Linux运维云计算课程汇集了虚拟化、云计算、安全攻防、Python开发、SRE等技术,课堂效率高、内容丰富全面,由浅入深,循序渐进,帮助学员稳扎稳打,夯实基础,在有限的时间内帮助学员高效提升,成为符合企业需求的技术型人才。

  推荐阅读:

  Linux配置网络参数的方式有哪些?

  Linux ping命令有什么用?

  Linux系统如何查看目录占用空间大小?

本文经授权发布,不代表老男孩教育立场。如若转载请联系原作者。