全缓冲与行缓冲

一、在linux系统中,标准的I/O提供了三种类型的缓冲。

1、全缓冲:在这种情况下,在填满I/O缓冲区后再进行实际的I/O操作。对于驻留在磁盘上的文件通常由标准I/O库实施全缓冲。调用fflush函数冲洗一个流。冲洗意味着将缓冲区的内容写到磁盘上。

2、行缓冲:在这种情况下,当在输入和输出遇到换行符时,标准I/O执行I/O操作。允许我们一次输出一个字符。涉及一个终端时,通常使用行缓冲。

对于行缓冲,有两个限制。第一,因为标准I/O库收集每一行的缓冲区的长度是固定的,所以只有填满的了缓冲区,那么即使没有换行符,也会进行I/O的操作。第二,任何时候只要通过标准I/O库要求从a一个不带缓冲的流,或者b一个行缓冲的流(它要求从内核得到数据)得到输入数据,那么就会造成冲洗所有行缓冲输出流。在b中带了一个在括号中的说明,其理由是,所需的数据可能已在缓冲区中,他并不需求在需要数据时才从内核读数据。很明显,从不带缓冲的一个流中进行输入要求当时从内核得到数据。

3、不带缓冲的。标准I/O不对字符进行缓冲处理。例如:如果标准I/O函数fputs写15个字符到不带缓冲的流上,就会调用write的相关的函数立即写入打开的文件上。

二、通过下面的代码,可以更清楚的了解全缓冲和行缓冲的区别。

  1. <span style="font-size:18px">#include<stdio.h>  
  2. #include<unistd.h>  
  3. int glob=6;  
  4. char buf[]="a write ro stdout\n";  
  5. int main()  
  6. {  
  7.         int var;  
  8.           
  9.         pid_t pid;  
  10.         printf("a write to stdout\n");  
  11.         //fflush(NULL);  
  12.         if((pid=fork())<0)  
  13.         {  
  14.                 printf("fork error");  
  15.         }  
  16.         else  
  17.         {  
  18.                 if(pid==0)  
  19.                 {  
  20.                         glob++;  
  21.                         var++;  
  22.                 }  
  23.                 else  
  24.                 {  
  25.                         sleep(2);  
  26.                         //i++;  
  27.                 }  
  28.         }  
  29.         printf("pid=%d,glob=%d,var=%d\n",getpid(),glob,var);  
  30.         exit(0);  
  31. }  
  32. </span>  
编译后运行结果:

gcc buff.c -o buff

./buff


再者,运行./buff>temp

cat temp




第一种编译的时候,因为采用的是交互式终端,所以采用的是行缓冲 ,在printf之后立即刷新缓冲区。

第二种编译,将I/O重定向在temp文件中,查看temp的文件,会有两次输出a write to stdout,因为它采用的是全缓冲。

可以将程序中fflush(NULL)加入,则只会输出一次

a write to stdout

因为flush即时刷新了缓冲区


个人后加观点:

由于子进程在fork之后将父进程的堆栈段以及缓冲区做了一份copy, so ,在子进程的标准输出缓冲区里面也存在与父进程的缓冲区厘米相同的东西,从而最后在重定向的作用下全部写到文件里面去了...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值