当前位置:编程学习 > C/C++ >>

另一道与fork有关的面试题

题目:请问下面的程序一共输出多少个“-”?
[cpp] 
#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
  
int main(void) 

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

一般熟悉fork机制会认为输出为6个'-',但我们运行一下,输出的是8个'-'.
基础知识见上一个题.
>>>程序一开使,bash产生一个进程P1执行此程序,
>>>P1进入程序后,当i=0时,fork()产生一个子进程P2,同时它自己输出一个'-'.
>>>P2继承P1的诸如环境变量,PC等环境,P2首现会输出一个'-'.同时此时i=1,会继续执行for循环---P2先fork()出一个子进程P3,同时再输出一个'-'.
>>>P3进程为P2的子进程,它会复制其父进程P2的指令,变量值,程序调用栈,环境变量,缓冲区等,它会输出一个'-'
       因为这里P3会继承P2的缓冲区,其中有一个'-',所以P3会输出两个'-'.
>>>P1进入程序后,当i=1时,fork()产生另一个它的子进程P4,同时输出一个'-'.
>>>P4同样会输出一个'-'.
       因为P4为P1的一个子进程它会继承P1的缓冲区,其中有一个'-',所以P4会输出两个'-'.
我们正常如上分析觉得应该产生6个'-'.
但为什么是8个呢,見红色部分加上的分析.
这是因为printf(“-”);语句有buffer,所以,对于上述程序,printf(“-”);把“-”放到了缓存中,在fork的时候,缓存被复制到了子进程空间,所以,就多了两个,就成了8个,而不是6个。
如果把上面的printf("-")改为
[cpp]
printf("-\n"); 
或着调用fflush清一下缓存.
[cpp]
printf("-"); 
fflush(stdout); 
都可以保正输出6个'-'

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,