【学习笔记】关于一道fork()之后printf()输出的题目

在某网站线上答题中遇到一题目描述如下:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 以下程序输出的‘-’的个数为()  
  2. A.6    B.8    CD略  
  3.   
  4. #include <stdio.h>  
  5. #include <stdlib.h>  
  6. int main(void)  
  7. {  
  8.     int i;  
  9.     for(i = 0;i<2; i++)  
  10.     {  
  11.         fork();  
  12.         printf("-");  
  13.     }  
  14.   
  15.     return 0;  
  16. }  

简单算了下是6个,结果发现答案是8。非常纳闷,就和实验室的讨论了下,并写了几个测试。


测试用例一

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. int main(void)  
  4. {  
  5.     int i;  
  6.     for(i = 0;i<2; i++)  
  7.     {  
  8.         fork();  
  9.         printf("-\n");  
  10.     }  
  11.   
  12.     return 0;  
  13. }  

该程序输出了6个‘-’,并分为六行


测试用例二

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. int main(void)  
  4. {  
  5.     printf("-");  
  6.     sleep(1);  
  7.     return 0;  
  8. }  

该程序在阻塞1秒后,输出‘-’


由此,得到结论:

1.printf()函数并非是将数据直接直接发送到屏幕上,而是将其暂存到缓存区。

2.缓存区的内容不会立即发送到屏幕上,而是等待当出现‘\n’,EOF,缓存区满,或是进程结束时,再将缓存区中所有的内容发送到屏幕上。


所以我们在回到刚才的题上,其实这个问题的重点在printf()函数上,而不是fork()!

第一次循环,fork()生成两个进程,并在每个进程的缓冲区内写入一个‘-’。注意,此时的printf();之后,内容是不输出到屏幕上的。

第二次循环,fork()再次生成两个新进程,并在每个进程的缓冲区再写入一个‘-’。此时共有四个进程,每个进程的缓冲区内存放两个‘-’。

结束循环,进程读取到return,将缓冲区内的信息输出到屏幕,并清空缓冲区。


这就解释了为什么会出现8个‘-’的现象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值