exec系类函数实例---产生一个僵死进程

声明:本人正在研读UNIX环境高级编程,相关博文为学习心得,观点可能会有错误,若那位大神发现错误,请留言指正,不胜感激。

父进程源码

<span style="font-size:14px;">#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

char * env_init[] = {"user=kelvin" , "path=/home/kelvin/WorkSpace"} ;

void main()
{

	int i = 0 ;

	pid_t pid ; 
	if((pid = fork()) < 0)
		printf("error\n") ;
	else if (pid == 0)
	{
		execle("/home/kelvin/WorkSpace/echoall" , "echoall" , "arg1" , "arg2" , (char *)0 , env_init) ;
	}

	if(waitpid(pid , NULL , 0) < 0)
		printf("error:waitpid\n") ;

	printf("*****************************************\n") ;

	if((pid=fork()) < 0)
		printf("error: fork 2\n") ;
	else if(pid == 0)
	{
		printf("fork 2 \n") ;
		execlp("echoall" , "echoall" , "1" , "2", (char *)0) ;
	}
	
	while(1)
	{
		sleep(1) ;
		system("ps -l") ;

	}
 
}</span>

子进程源码

<span style="font-size:14px;">#include <stdio.h>
#include <string.h>

void main(int argc , char * argv[])
{
	printf("argv[1]:%s\n" , argv[1]) ;
}</span>


    父进程第一次调用fork创建一个新进程,新进程运行echoall程序,并且父进程通过调用waitpid获取子进程返回值,这样,防止子进程编程僵尸进程。

    而第二次调用fork创建第二个子进程时,没有等待获取子进程返回值。父进程一直在执行,一直不结束,子进程将先结束。由于,内核得知子进程的父进程依然存在,因此,不去释放子进程的数据结构所占用的内核空间。导致,子进程变成了僵尸进程。

    运行结果如下图所示,父进程将一直处于睡眠状态,因为,一直在调用sleep(1),将父进程处于睡眠状态。而第二次创建的子进程,将一直处于僵死状态。


    解除子进程将死状态的方法,只用当僵尸进程的父进程退出后,僵尸进程将变成orphan进程,将被init所领养,init将成为僵尸进程的父进程。然后,由init回收僵尸进程的返回值。如下代码修改所示,只要僵尸进程的父进程结束后,僵尸进程的僵死状态将会被解除。

<span style="font-size:14px;">while(1)
{
	sleep(1) ;
	system("ps -l") ;
}</span>

改为

<span style="font-size:14px;">for(i ++; i < 3 ; i ++)
{
	sleep(1) ;
	system("ps -l") ;
}</span>
    执行结果如下图所示,也可尝试使用如下代码,将僵尸进程的父进程kill掉,来解除exec-demo和echoall的父子关系,由init来回收echoall,结束echoall的僵死状态。

<span style="font-size:14px;">while(1)
{
    sleep(1) ;
    system("ps -l") ;
    if(条件满足)
        system("kill exec-demo")
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值