某公司笔试题——Linux fork()

30 篇文章 2 订阅

直接来源代码:

#include <stdio.h>
#include <unistd.h>
#include <wait.h>

int main()
{
    for (int i = 0; i < 2; ++i)
    {
        fork();
        printf("K");
    }
    wait(NULL);
    return 0;
}
请问会输出多少个K?


进程关系如下图:

图.1 进程关系示意图

由上图,一看可以看到输出结果是6.

可是,少年,Too young,too simple啊。

fork一个进程会发生什么事?大多数人都知道会复制程序调用栈,环境变量等等,程序代码段当然不会复制了。

但是,遗漏了一个重要的东西,那就是缓冲区,缓冲区在fork的时候也要被复制一份!!!

那知道会发生什么了吧,上面程序是调用c标准输出函数输出k,也就是printf,而标准输出是基于行缓冲的;第一次调用fork的时候,父子进程的K并没有输出,而是在缓冲区里面。

如果是:

...
printf("K\n");
...
或者:

...
write(STDOUT_FILENO, "K", 1);
...
那么缓冲区就将被刷新,此时就是输出6个K.


因为输出缓冲区没被刷新,所以程序执行就像这样:

图.2 程序fork输出示意图


所以,针对这条题目,是输出8个K。


最后,感谢,学习了!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值