一个fork的面试题

很有意思,分析一下,加深一下对fork机制的理解。代码如下:
题目:请问下面的程序一共输出多少个“-”?

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

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

这道题里面其实有两个地方需要注意,要不然就没法得到正确的答案。第一个就是fork函数的特点,一次调用,两次返回,第一次返回0,为子进程,第二次返回值为子进程的pid,为父进程,按照这思路分析,想想题目应该有多少个’-‘输出。

假设第一个进程为A,i==0时,A调用fork,这时候fork第一次返回是子进程B,这之后打印出了第1个’-‘,fork第二次返回是父进程A,然后就打印出了第2个’-‘. 当i==1时,进程A和进程B都会轮流调用fork,这时候就会递归i==0的过程。所有按照这个分析思路最后结果应该为6个’-‘。

可是,很遗憾,答案是8个。为什么呢?

当父进程在调用fork创建一个子进程的时候,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。由于printf没有输出换行符,这时候,缓冲区会一直存储直到满,才会flush. 这时候相信大家开始明白为什么答案是8了。没错,当i==1的时候,父进程再次调用fork并第一次返回的时候,会输出两个’-‘,
同样进程B调用fork并第一次返回的时候,也会输出两个’-‘.所以,(1+1)+((1+1)+1+(1+1)+1)=8.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值