wait解决僵尸进程

C0301—2022.0315
进程常规语句
在父进程里调用wait函数,查看效果。整个父进程做了三件事:两次打印、一次调用wait函数。

一、子进程做了死循环。

int pid = 0;
	int status = 0;//状态
	int res = 0;//wait返回值
	pid = fork();
	if (pid == 0)
	{
		cout << "进入子进程逻辑 pid=" << getpid() << endl;
		for (int i = 0; i >-1; i++)
		{
			cout << "子进程 for i=" << i << endl;
			sleep(2);//防止打印太快
		}
	}
	else if (pid>0)
	{
		cout << "进入父进程逻辑 pid=" << getpid() << endl;
		res = wait(&status);
		cout << "wait后 父进程"<< endl;
	}

因VS return打了断点结束不了,故用linux内核编译运行。
生成—重新生成解决方案
在这里插入图片描述
到Ubuntu里找到工程所在文件夹,右击 在终端打开
在这里插入图片描述
编译运行发现
(1)子进程一直在死循环
在这里插入图片描述
(2)父进程只做了第一步,且处于睡眠可唤醒状态。
wait等待子进程结束后再有返回值,此例子子进程是个死循环。
在这里插入图片描述
二、子进程循环可以结束,观察父进程调用wait函数后是什么情况

	int pid = 0;
	int status = 0;//状态
	int res = 0;//wait返回值
	pid = fork();
	if (pid == 0)
	{
		cout << "进入子进程逻辑 pid=" << getpid() << endl;
		for (int i = 0; i <10; i++)
		{
			cout << "子进程 for i=" << i << endl;
			sleep(2);
		}
	}
	else if (pid>0)
	{
		cout << "进入父进程逻辑 pid=" << getpid() << endl;
		res = wait(&status);
		cout << "wait后 父进程 res="<<res<< endl;
	}

编译运行后,循环中
在这里插入图片描述
子进程循环结束后,可以看到,父进程打印了调用wait函数后的语句。说明子进程循环结束后,wait函数返回子进程的ID,然后再接着打印后面的语句。

由此可知,wait函数起阻塞的作用,子进程运行结束后,再返回子进程ID,接着下面的操作。

可以解决,子进程先于父进程结束,造成僵尸进程的问题。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值