Linux 当fork在for循环中的问题

以下代码会打印几个"A"?

例1.代码如下:

int main(int argc, char* argv[],char* envp[])   
{      
	for(int i = 0;i < 2; i++ )   
    {   
		fork();   
		printf("A\n");   
	}   
	exit(0);  
}   
 

代码分析:

//父进程
	for(int i = 0;i < 2; i++ )   
    {   
		fork();   
		printf("A\n");   
	} 

此时i=0,进入循环,执行fork,产生一个子进程1:

//子进程1
	for(int i = 0;i < 2; i++ )   
    {   
		fork();   
		printf("A\n");   
	} 

父进程执行完fork之后会执行printf("A\n");输出"A"。然后执行for循环中的i++,i的值等于1,符合i<2,再次进入循环,又执行一次fork,再产生一个子进程2,并且会再执行printf("A\n");输出"A"。然后执行for循环中的i++,i的值等于2,不符合i<2,所以不进入循环。此时子进程2的for循环中的i的值变为了1:

//子进程2
	for(int i = 1;i < 2; i++ )   
    {   
		fork();   
		printf("A\n");   
	} 

子进程2是由父进程第二次进入循环的时候复制而来的,而子进程2中的fork在父进程进入第二次循环执行fork产生子进程2的时候已经执行完了,所以子进程2直接执行printf("A\n");输出"A"

这时,父进程的循环就结束了,接下来看子进程1的循环,父进程第一次执行fork的时候产生的子进程1如下:

//子进程1
	for(int i = 0;i < 2; i++ )   
    {   
		fork();   
		printf("A\n");   
	} 

这时子进程1for循环中i的值等于0,进入循环,这里的fork在父进程第一次进入循环执行fork产生子进程1的时候就已经执行完了,所以直接执行printf("A\n"); 输出"A"。然后执行for循环中的i++,i的值等于1,符合i<2,再次进入循环,执行fork产生子进程3,并且执行printf("A\n");输出"A"。子进程3如下:

//子进程3
	for(int i = 1;i < 2; i++ )   
    {   
		fork();   
		printf("A\n");   
	} 

此时,子进程3是由子进程1第二次进入循环复制而来的,所以子进程3中的fork在子进程1第二次进入循环执行fork产生子进程3的时候就已经执行完了,所以子进程3直接执行printf("A\n"); 输出"A"

运行结果:

一共输出6个A。

在这里插入图片描述
例2.代码如下:

int main(int argc, char* argv[],char* envp[])   
{   
	for(int i = 0;i < 2; i++ )   
	{   
         fork();   
         printf("A");   
    }  
    exit(0); 
}   

代码分析:

以上代码中在fork之后的printf("A"); 这条语句中没有"\n",所以输出的"A"没有办法输出到屏幕上,只能放在父进程的缓冲区,在fork之后,缓冲区所占的空间要复制给子进程。当i=0进入循环,第一次执行fork之后产生子进程1,然后执行printf("A"); ,这时"A"并没有输出到屏幕上,而是放到了缓冲区中,当i++之后,i等于1的时候再fork的时候会把缓冲区中的内容"A"复制一份给子进程2。所以子进程2在输出的时候会打印两个"A",而父进程中放到缓冲区的"A"会在父进程两次循环结束之后退出程序之后输出,存放到缓冲区中的"A"并不会不输出,而是在程序结束后输出。同理,子进程3在输出的时候会打印两个"A",而子进程1中放到缓冲区的"A"会在子进程1两次循环结束之后退出程序之后输出。所以这个题的答案会比第一个题的答案多出来两个"A"。

运行结果:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值