A. 考虑以下 C 程序。假设程序执行完成并且 fork、waitpid 和 printf 总是成功。

上一期留的的解答来了。我是新手,如果写的不对,希望各位大佬指点一二
看这里:fork()函数详解+示例分析(手工画图+代码图解分析)

A、考虑以下 C 程序。假设程序执行完成并且 fork、waitpid 和 printf 总是成功。
本题中用到了waitpid,简单介绍一下waitpid的用法:
waitpid的原型:pid_t waitpid(pid_t pid , int *status , int options)

pid:processid,即进程的ID。pid的值不同时,会有不同的意义。
1.pid > 0时,只等待进程ID等于pid的子进程,只要该子进程不结束,就会一直等待下去;
2.pid = -1时,等待任何一个子进程的退出,此时作用和wait相同;
3.pid = 0时,等待同一个进程组中的任何子进程;
4.pid < -1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。

waitpid的返回值一共有三种情况:
1.当返回正常时,waitpid返回收集到的子进程的进程ID;
2.如果设置了WNOHANG,而调用中waitpid发现自己没有已退出的子进程可收集,则返回0;
3.如果在调用中出现错误,则返回-1,同时errno会被设置成相应的值来提示错误

int main(){
	pid_t pid;
	int sum=0;
	if((pid=fork())==0){
		sum+=10;
	}
	else{
		waitpid(pid,NULL,0);
		sum-=5;
	}
	sum+=20;
	if(pid>0){
		printf("Parent: sum=%d\n",sum);
	} 
	else
		printf("Child: sum=%d\n",sum);
	return 0;
} 

显示此程序的输出:

Child:sum=30

Parent:sum=15

解析:初始sum=0,遇到第一个fork,一分为二,父进程需要等待子进程结束之后才能进行,故先进行子进程,执行sum+=10,sum+=20,故输出Child:sum=30,对父进程而言,sum+=-5,sum+=20,故输出Parent:sum=15
在这里插入图片描述
B. 现在考虑与 A 部分相同的程序,但删除了对 waitpid 的调用。假设程序执行完成并且 printf 总是成功。不对其他函数调用的结果做任何假设。
列出此类程序的所有可能输出。每个空白框包含一次程序执行的完整输出。一些空白框可能会被闲置。
本题不再考虑waitpid,所以本题应该有三个结果,前两个都是在fork()正常进行的情况下,最后一个看加粗的部分,说明fork有可能会发生异常,故可能结果如下所示:

1、Parent:sum=30
   Child:sum=15
2、Child:sum=15
   Parent:sum=30
3、如果fork()失败并返回-1,Child:sum=15

C. 考虑下面的 C 程序。假设程序运行完成并且所有函数都正常返回。
在这里插入图片描述
根据代码画流程图如下所示:
在这里插入图片描述

解析:所以可能的输出为3050与9的任意组合,或者5030与9的任意组合

本篇博客到此结束,如果有写的不对的地方,请各位指正Orz~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuckyInn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值