Linux “fork()”之后的printf异常——stdout的缓冲

思考一个问题

int main()
	{
		int i=0;
		for(i=0;i<2;i++)
		{
			fork();

			printf("-");
		}
		return 0;
	}

上述代码会输出几次 “-”

结果如下
在这里插入图片描述
我们可以看到有8个 - 符号被输出了。

这里涉及到printf的知识:stdout的缓冲机制

printf输出条件: (1) 调用fflush; (2) 缓冲区满了; (3) 遇到\n \r这些字符 (4) 遇到scanf这些要取缓冲区的; (5) 线程或者进程退出

所以八个-是由于printf的输出缓存造成的,Stdout中-没有等待到\n的刷新,父进程在子进程创建之前还未结束就被一起复制到了子进程,等待子进程 结束后在子进程的-之前一起打印了出来
在这里插入图片描述
证实一下我们的猜测

    1 #include <myhead.h>
    2 int main(int argc,char *argv[])
    3 {
    4     int i =0;
    5     int count =0;
    6     for(i =0;i<2;i++)
    7     {
    8         int ret =fork();
    9         if(ret >0)
   10         {
   11             printf("father%d",i);
   12         }else if(ret ==0)                                              
   13         {
   14 
   15             printf("child%d",i);
   16         }
   17     }
   18     return 0;
   19 }
   20 


在这里插入图片描述
正如图所示,程序递归的运行先运行的是father这棵树,father0被缓冲在stdout中和child1一起输出,同理child0被缓冲,和它的child1一起输出

这次我们进行最后的证实,利用fflush手动刷新

1 #include <myhead.h>
    2 int main()
    3 {
    4     int i=0;
    5     for(i=0;i<2;i++)
    6     {
    7         int ret =fork();
    8         if(ret ==0)
    9         {
   1011         printf("child%d-",i);                                       
   12         fflush(stdout);
   13         }else if(ret >0)
   14         {
   1516         printf("father%d-",i);
   17         fflush(stdout);
   18         }
   19 
   20     }
   21     return 0;
   22 
   23 }
  ~     

结果如下
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值