Linux--僵尸进程与孤儿进程总结

一、基本概念

僵尸进程:在Linux系统中,一个子进程结束了,但是他的父进程没有没有调用wait/waitpid,那么父进程会变成一个僵尸进程。
孤儿进程:孤儿进程指的是在其父进程执行完成或被禁止后仍继续运行的一类进程。这些孤儿进程将被init进程(进程号为1)所收养,并由init进程对他们完成状态收集工作。

二、危害

僵尸进程:
在正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远
无法预测子进程到底什么时候结束。当一个进程完成它的工作终止之后,内核释放该进程的所有资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(进程号,推出状态,运行时间等)所以他的父进程需要调用wait/waitpid系统调用取的子进程的终止状态,释放那段信息。如果产生大量的僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。
孤儿进程:
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。

三、僵尸与孤儿进程的验证

僵尸程序测试程序如下:
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>

int main()
{
	pid_t pid=fork();
	if(pid<0)
	{
		perror("fork error");
		exit(1);
	}
	else if(pid==0)
	{
		//child
		printf("child is exiting!\n");
	}
	else
	{
		//father
		sleep(5);
		system(" ps -o pid,ppid,state,tty,command");
		printf("father is exiting!\n");
	}
	return 0;
}


孤儿程序测试程序如下:
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<unistd.h>

//孤儿进程

int main()
{
	pid_t pid=fork();
	if(pid<0)
	{
		perror("fork error:");
		exit(1);
	}
	else if(pid==0)
	{
		//child
		printf("I am the child process.\n");
		printf("pid: %d,ppid: %d\n",getpid(),getppid());
		printf("after 5 second\n");//睡眠5秒,让父进程先退出
		sleep(5);

		printf("pid: %d,ppid: %d\n",getpid(),getppid());
		printf("child process is exited.\n");
	}
	else
	{
		printf("I am father process\n");
		sleep(1);
		printf("father process is exited.\n");
	}
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值