关于孤儿进程和僵尸进程的实践

首先关于孤儿进程

processA   processB   processC

ps -ef|grep process

sroot     9665 24982  0 23:42 pts/0    00:00:00 /bin/bash ./processA.sh

sroot     9666  9665  023:42 pts/0    00:00:00 /bin/bash./processB.sh

sroot     9667  9666  023:42 pts/0    00:00:00 /bin/bash./processC.sh

24982  -> 9665 /processA.sh ->9666 ./processB.sh ->9667 ./processC.sh

24982是INIT下/bin/bash .

[[email protected] 24982]# pwd

/proc/24982

[[email protected] 24982]# ll

total 0

lrwxrwxrwx. 1 sroot root 0 Jun 22 23:45 cwd -> /home/craft/shell

-r--------. 1 sroot root 0 Jun 22 23:45 environ

lrwxrwxrwx. 1 sroot root 0 Jun 22 23:32 exe -> /bin/bash

[[email protected] 24982]# ps -ef |grep 24982

sroot     9665 24982  0 23:42 pts/0    00:00:00 /bin/bash ./processA.sh

sroot    19995  2740  023:47 pts/1    00:00:00 grep 24982

sroot    24982 24935  0 23:32 pts/0    00:00:00 bash

之后,kill -9 processB 看A和C的变化

[[email protected] 24982]# ps aux |grep process

sroot    17693  0.0 0.0 106104  1172 pts/0    S+  00:22   0:00 /bin/bash./processA.sh

sroot    17694  0.0 0.0 106104  1172 pts/0    S+  00:22   0:00 /bin/bash./processB.sh

sroot    17695 32.8  0.0 106108 1192 pts/0    S+   00:22  0:01 /bin/bash ./processC.sh

ps aux |grep process

只剩下一个/processC.sh,A和B 都不见了

sroot    17695 36.2  0.0 106108 1192 pts/0    R    00:22  0:12 /bin/bash ./processC.sh

也就是B死掉的时候,会去通知他的父进程A。

本身A的存在就是等待B 完成的,所以B死掉,A也释放了。

但是C并不知道。

这个时候A不停的继续跑,并且无法用ctrl+c结束。

知道kill -9 processC的进程号。

这个时候并不会产生僵尸进程

此时,C就是孤儿进程。

如何产生僵尸进程

首先,僵尸进程是由于父进程没有回收子进程。

父进程会使用wait函数来等待子进程若子进程结束,用这个函数来回收子进程。

#include <stdio.h>

#include <sys/types.h>

#include <time.h>

int main()

{

//fork a child process

pid_t pid = fork();  产生一个子进程。新产生的子进程同样用这个代码。这样就会有两个程序在使用同一个代码运行。

if (pid > 0)   //parentprocess父进程进入这个if判断。

{

printf("in parentprocess, sleep for one miniute...zZ...\n");

struct timeval tv;

gettimeofday(&tv,NULL);

printf("parent microsecond:%ld\n",tv.tv_sec*1000000 +tv.tv_usec);  //微秒 输出当前的时间

sleep(60);

printf("aftersleeping, and exit!\n");

gettimeofday(&tv,NULL);

printf("parentmicrosecond after sleeping:%ld\n",tv.tv_sec*1000000 + tv.tv_usec);  //微秒

重新输出sleep之后的时间

}

else if (pid == 0)          子进程进入这个if判断语句

{

//child process exit,and to be a zombie process

printf("in child process, and exit!\n");

structtimeval tv;

gettimeofday(&tv,NULL);

printf("child microsecond:%ld\n",tv.tv_sec*1000000 +tv.tv_usec);  //微秒

输出进入到子进程的时间

}

}

用gcc指令编译

[[email protected] test]# gcc zombie1.c -o zombie1

[[email protected] test]# ./zombie1  运行

运行结果如下

./zombie1

in parent process, sleep for one miniute...zZ...父进程先进入第一个判断语句,输出时间

parent microsecond:1498469853526179

in child process, and exit!    子进程进入判断语句,输出时间

child microsecond:1498469853526404

after sleeping, and exit!

parent microsecond aftersleeping:1498469913532272   父进程结束sleep,输出时间,这个时间跟第一个输出时间相差为60s。

用ps查看进程情况

[[email protected] test]# ps aux |grep zombie

root       3445  0.0 0.0   3924   416 pts/2   S+   05:37   0:00 ./zombie1

root       3446  0.0 0.0      0     0 pts/2   Z+  05:37   0:00 [zombie1]<defunct>

出现一个僵尸进程

[[email protected] test]# ps -ef |grep zomb

root       3445   3024 0 05:37 pts/2    00:00:00./zombie1

root       3446   3445  0 05:37 pts/2    00:00:00 [zombie1] <defunct>

从进程ID能看出这个僵尸进程是zombie的子进程

  • kill掉defunct进程方法有二:
  • 1,重启服务器电脑,这个是最简单,最易用的方法,但是如果你服务器电脑上运行有其他的程序,那么这个方法,代价很大。
               所以,尽量使用下面一种方法
  • 2,找到该defunct僵尸进程的父进程,将该进程的父进程杀掉,则此defunct进程将自动消失。
时间: 2025-01-05 15:35:12

关于孤儿进程和僵尸进程的实践的相关文章

孤儿进程和僵尸进程

孤儿进程和僵尸进程 一.定义:什么是孤儿进程和僵尸进程 僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出.这个子进程就是僵尸进程. 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作. 僵尸进程将会导致资源浪费,而孤儿则不会. 子进程持续10秒钟的僵尸状态(EXIT_ZOMBIE)------------------------------

孤儿进程与僵尸进程[总结]

http://www.cnblogs.com/Anker/p/3271773.htm 1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊.今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上面,没有深入,倍感惭愧.晚上回来google了一下,再次参考APUE,认真总结一下,加深理解. 2.基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程

快速理解孤儿进程和僵尸进程

下面是我大约11年前在读APUE(<Unix环境高级编程>)对孤儿进程和僵尸进程的理解,为了便于记忆,采用打比方的方式予以解释. (当然不一定精准,后面我会贴出wikipedia上的专业解释.) 操作系统OS好比一个公司,公司的CEO就是init进程. 任何一个子进程都有父进程,就好比任何一个人都有爹. 这里假定子进程为小明,父进程为小明的爸爸. init进程作为OS公司的CEO,是小明的爷爷(注:小明的爸爸很可能是CEO的第N代后人,N>=1,这里假定N=1). 任何一个进程在退出之后

【Linux】孤儿进程和僵尸进程

本文转载自:http://www.cnblogs.com/anker/p/3271773.html 并做了小幅修改. 1.基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态. 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些

wait函数返回值总结,孤儿进程与僵尸进程[总结]

http://blog.csdn.net/astrotycoon/article/details/41172389 wait函数返回值总结 http://www.cnblogs.com/Anker/p/3271773.html 孤儿进程与僵尸进程[总结]

进程与线程(三) 孤儿进程与僵尸进程

具体细节可参考: http://www.cnblogs.com/Anker/p/3271773.html 本文只是用最小的语言总结: 两者对比:(爹是父进程,孩子是子进程) 爹没了,孩子还在,孩子就是孤儿进程,孤儿被(init)收养. 爹在,孩子在,但是爹不管孩子了,因为有爹又不能收养,此时的孩子就是僵尸进程. 1.你知道什么是僵尸进程,(对系统有害),如何产生的? 僵尸进程不是活着的进程,可以说就是一个数据结构,它是已经完成的任务的进程,但是不是它完成任务后就会烟消云散的,他会留下一点东西,这

孤儿进程与僵尸进程【比较】

今天在群里聊起僵尸进程,才发现自己把僵尸进程和孤儿进程搞混了,简直不能原谅.速度查了一下,原来如此.感谢原作者的分享,如下:    1.基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态. 孤儿进程:一个父进程退出,而它的一个或多个子进程还在

(转)进程间关系:进程、僵尸进程、孤儿进程、进程组、前台进程组、后台进程组、孤儿进程组、会话、控制终端

不同的shell对使用管道线时创建子进程的顺序不同,本文以bash为例,它是支持作业控制的shell的典型代表. 僵尸进程与孤儿进程 僵尸进程:先于父进程终止,但是父进程没有对其进行善后处理(获取终止子进程有关信息,释放它仍占有的资源).消灭僵尸进程的唯一方法是终止其父进程.孤儿进程:该进程的父进程先于自身终止.其特点是PPID=1(init进程的ID).一个孤儿进程可以自成孤儿进程组. 文中用到的缩写 PID = 进程ID (由内核根据延迟重用算法生成)PPID = 父进程ID(只能由内核修改

孤儿进程与僵尸进程[总结](转载)

1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊.今天被人问到什么是孤儿进程和僵尸进 程,会带来什么问题,怎么解决,我只停留在概念上面,没有深入,倍感惭愧.晚上回来google了一下,再次参考APUE,认真总结一下,加深理解. 2.基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当一个 进程完

linux 孤儿进程和僵尸进程

孤儿进程和僵尸进程: 如果父进程先退出,子进程还没退出那么子进程的父进程将变成init进程(任何一个进程都有一个父进程) 如果子进程先退出,父进程还没有退出,那么子进程必须要等到父进程捕获到了子进程的退出状态才真正结束,否则这个时候子进程就成为僵尸进程. 如果父进程先结束,子进程会托孤给1号进程 怎样避免僵尸进程呢?是由于父进程没有给子进程收尸,怎么解决这个问题呢.父进程再创建子进程的时候,利用singal(sigchild,sig_ing) 告诉内核不管子进程的生命周期. 本文来源:http: