Linux fork()||fork()问题

以下代码会输出几个"A"?

int main()   
{   
  
	fork() || fork();

	printf("A\n");
     
}   

代码分析:

//父进程
	fork() || fork();

	printf("A\n");

这里父进程中的第一个fork先执行,产生一个子进程:

//子进程1
	fork() || fork();

	printf("A\n");

这时有两个进程,且两个进程的第一个fork已经执行完了。

在父进程中fork的返回值是大于0的,子进程1中fork的返回值是等于0的。按照期望,如果父进程中的fork()||fork();是“或”的关系,第一个fork大于0时表达式就已经成立了,那么后边的fork是不执行的,它没有机会执行,所以直接执行printf("A\n");,输出"A"。

这时,对于子进程1来说,第一个fork已经执行完了,它的返回值是等于0的,对于“或”的关系来说,表达式不成立,就要看“||”的另一边,所以执行子进程1中fork()||fork();的第二个fork,这个fork执行,就把子进程1复制了一份又产生了一个子进程2:

//子进程2
	fork() || fork();

	printf("A\n");

这时候,对于子进程1来说fork() || fork();中的第一个fork的返回值等于0,第二个fork的返回值大于0,表达式成立,执行printf("A\n");,输出"A"。这时候其实无论第二各fork是否大于0都会执行printf("A\n");,输出"A"。

在子进程2中,fork() || fork();两个fork都执行过了,直接执行printf("A\n");,输出"A"。

运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值