网站建设空心正方形,搜索引擎优化论文,蓟县网站建设公司,如何制作网址图片孤儿进程#xff1a;父进程先于子进程结束#xff08;遇到return、exit、异常终止等情况时#xff09;#xff0c;则子进程成为孤儿进程#xff0c;子进程的父进程成为init进程#xff0c;称为init进程领养孤儿进程。可以通过getppid函数来查看孤儿进程的父进程ID#x…孤儿进程父进程先于子进程结束遇到return、exit、异常终止等情况时则子进程成为孤儿进程子进程的父进程成为init进程称为init进程领养孤儿进程。可以通过getppid函数来查看孤儿进程的父进程ID即init进程的IDinit进程的ID具体是多少取决于操作系统对进程的调度其值是不确定的。在操作系统中init进程也不止一个可通过ps aux详细查看。
僵尸进程进程终止父进程尚未回收子进程残留资源PCB存放于内核中变成僵尸Zombie进程。
特别注意僵尸进程是不能使用kill命令清除掉的。因为kill命令只是用来终止进程的而僵尸进程已经终止。
// orphan.c //shell产生子进程执行该程序
#include stdio.h
#include unistd.h
#include sys/wait.hint main(void)
{ pid_t pid;pid fork(); //创建子进程if (pid 0) {while (1) {printf(I am child, my parent pid %d\n, getppid());sleep(1); //子进程一直运行}} else if (pid 0) {printf(I am parent, my pid is %d\n, getpid());sleep(9);printf(------------parent going to die------------\n); //父进程先于子进程结束子进程变为孤儿进程} else {perror(fork);return 1; //等价于exit(1)都是结束进程且进程结束状态置1表示出错}return 0;
}
[rootlocalhost wait]# ./orphan
I am parent, my pid is 26900
I am child, my parent pid 26900
I am child, my parent pid 26900
I am child, my parent pid 26900
I am child, my parent pid 26900
I am child, my parent pid 26900
I am child, my parent pid 26900
I am child, my parent pid 26900
I am child, my parent pid 26900
I am child, my parent pid 26900
------------parent going to die------------ //父进程正常结束
I am child, my parent pid 1 //子进程为孤儿进程被init进程领养即其父进程为init进程
[rootlocalhost wait]# I am child, my parent pid 1 //父进程结束shell进程收回前台等待命令交互
I am child, my parent pid 1 //子进程一直执行为孤儿进程
I am child, my parent pid 1
I am child, my parent pid 1
I am child, my parent pid 1
I am child, my parent pid 1
//zoom.c
#include stdio.h
#include stdlib.h
#include unistd.h
#include sys/wait.hint main(void)
{pid_t pid;pid fork(); if (pid 0) {printf(---child, my parent %d, going to sleep 10s\n, getppid());sleep(10);printf(-------------child die--------------\n); //子进程先正常结束} else if (pid 0) {while (1) {printf(I am parent, pid %d, myson %d\n, getpid(), pid);sleep(1);} //父进程一直运行} else {perror(fork);return 1;}return 0;
}
[rootlocalhost wait]# ./zoom
I am parent, pid 27152, myson 27153
---child, my parent 27152, going to sleep 10s
I am parent, pid 27152, myson 27153
I am parent, pid 27152, myson 27153
I am parent, pid 27152, myson 27153
I am parent, pid 27152, myson 27153
I am parent, pid 27152, myson 27153
I am parent, pid 27152, myson 27153
I am parent, pid 27152, myson 27153
I am parent, pid 27152, myson 27153
I am parent, pid 27152, myson 27153
I am parent, pid 27152, myson 27153
-------------child die-------------- //子进程死亡
I am parent, pid 27152, myson 27153 //父进程一直运行一直占据前台shell进程无法获得前台交互 且子进程结束后父进程没有对子进程残留在内核中的PCB进行回收从而子进程变为僵尸进程。
I am parent, pid 27152, myson 27153
I am parent, pid 27152, myson 27153
I am parent, pid 27152, myson 27153
[rootlocalhost wait] # ps aux
root 27152 0.0 0.0 4160 352 pts/1 S 03:11 0:00 ./zoom
root 27153 0.0 0.0 0 0 pts/1 Z 03:11 0:00 [zoom] defunct
root 27155 0.0 0.0 0 0 ? R 03:12 0:00 [kworker/3:0]
root 27163 0.0 0.0 107892 360 ? S 03:12 0:00 sleep 60
root 27164 0.0 0.0 123360 1384 pts/0 R 03:12 0:00 ps aux
[rootlocalhost wait]# kill 27152
由上可以看出父进程27152为S表示该进程在后台运行注意ps aux命令是在另一个终端执行的因此相对于另一个shell终端父进程在后台运行子进程27153为Z表示僵尸进程说明该进程终止后其残留在内核的PCB资源没有被父进程回收而ps aux这个命令的进程为R表示在前台运行即就在pts/0设备终端的前台运行。而前两个进程属于pts/1设备。[zoom] defunct defunct表示已故的不复存在的但其痕迹仍然残留在内核中占用内存资源因此需要做到及时对僵尸进程回收和清除。
总结在每个进程退出的时候 内核释放该进程所有的资源包括打开的文件占用的内存等。但是仍然为其保留一定的信息包括进程号the process ID退出状态the termination status of the process运行时间the amount of CPU time taken by the process等。直到父进程通过wait / waitpid来取时才释放。 另外如果父进程一直不结束不终止在不调用wait或waitpid的情况下其子进程结束后会变为僵尸进程残留在内核中此时若父进程结束了那么这些僵尸进程因为没有了父进程就会变为孤儿进程被init进程领养init进程就会对这些僵尸进程进行回收然后清除。因此父进程结束了其子进程会被回收。孤儿进程结束后也会被init进程回收。如果要回收一个进程除了通过其父进程调用wait或waitpid函数外还可以杀死其父进程让其变为孤儿进程被init进程回收。
系统所能使用的进程号是有限的如果大量的产生僵死进程将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害应当避免。可以fork两次 父进程fork一个子进程然后继续工作子进程fork一个孙进程后退出那么孙进程被init接管孙进程结束后init会回收。不过子进程的回收还要自己做。