fork()请问下面的程序一共输出多少个“-”?

fork()

题目:请问下面的程序一共输出多少个“-”?

#include 
    
     
#include 
     
      
#include 
      
       
int main(void) 
{ 
int i; 
for(i=0; i<2; i++){ 
fork(); 
printf("-"); 
} 
return 0; 
}                    
      
     
    

解析:一共输出8个。
首先程序一开始,bash产生一个进程P1执行此程序,P1进入程序。
当i=0时:
fork()产生一个子进程P2,同时它自己输出一个’-‘。P2继承P1的诸如环境变量,P2首现会输出一个’-‘。
当i=1,会继续执行for循环—P2先fork()出一个子进程P3,同时再输出一个’-‘。
P3进程为P2的子进程,它会复制其父进程P2的指令,变量值,程序调用栈,环境变量,缓冲区等,它会输出一个’-‘。
此时P1进入程序后,当i=1时,fork()产生另一个它的子进程P4,同时输出一个’-‘。P4同样会输出一个’-‘。
我们正常分析觉得应该产生6个’-‘。

这是因为printf(“-”);语句有buffer,所以,对于上述程序,printf(“-”);把“-”放到了缓存中,在fork的时候,缓存被复制到了子进程空间,所以,就多了两个,就成了8个,而不是6个。
因为这里P3会继承P2的缓冲区,其中有一个’-‘,所以P3会输出两个’-‘。

因为P4为P1的一个子进程它会继承P1的缓冲区,其中有一个’-‘,所以P4会输出两个’-‘。
若将程序改为:

#include 
     
      
#include 
      
       
#include 
       
        

int main(void)
{
	int i;
	for (i = 0; i<2; i++){
		fork();
		printf("-\n");
	}

	return 0;
}
       
      
     

则输出六个。

    原文作者:step_ma
    原文地址: https://blog.csdn.net/step_ma/article/details/75269123
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞