zombie 僵死进程(zombie进程会在进程表---ps -aux 中Defunct)

/*
 * zombie.c
 *
 *  Created on: 2011-11-9
 *      Author: lc
 */

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

//产生一个zombie进程
//原因:子进程先于父进程退出,但是,父进程没有调用wait函数接受子进程退出状态,
//导致子进程成为了一个僵尸进程---即,只在进程资源表中占位,已经被杀死了

//父进程的退出也会导致僵尸子进程的退出
//预防方法:
 // wait(子进程先于父进程退出)
 // 托管 (父进程先于子进程退出,子进程被init接管)
int main(int argc, char **argv) {
	pid_t id;

	if ((id = fork()) < 0) {
		perror("fork");
	} else if (id == 0) {
		printf("child process [%d]\n",getpid());
		exit(0);
	}

	else {
		//wait();
		printf("parent process [%d]\n",getpid());
		sleep(60);
	}

	return 0;

}

使用父进程退出方式预防僵尸进程(让init托管子进程)

 

/*
 * zombie2.c
 *
 *  Created on: 2011-11-9
 *      Author: lc
 */

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
/*
 * 托管法预防僵尸进程:
 * 使用两次fork,产生两个子进程 p1 p2 ,p1 是p2 的父进程
 * 使 p1退出,p2就被init进程托管
 * 无需在父进程中wait p2的退出,p2 也不会成为僵尸进程
 *
 */
int main(int argc, char **argv) {
	pid_t id1, id2;

	if ((id1 = fork()) < 0) {
		perror("fork1");
	} else if (id1 == 0) {
		printf("child1 [%d]\n", getpid());
		if ((id2 = fork()) < 0) {
			perror("fork2");
		} else if (id2 == 0) {
			printf("child2 [%d]\n", getpid());
			sleep(30);
			exit(0);
		} else {
			exit(0);
		}
	} else {
		printf("parent [%d]\n",getpid());
		waitpid(id1, NULL, 0);
		exit(0);
	}

	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值