码迷,mamicode.com
首页 > 其他好文 > 详细

APUE学习笔记——5.4缓冲Buffering

时间:2014-08-25 11:57:14      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:缓冲   buffer   全缓冲   行缓冲   setbuf   

缓冲的几个基本概念

    缓冲的作用:减少系统read和write的次数
全缓冲
        系统标准I/O缓冲区被写满时才进行真正的I/O操作。
        磁盘文件一般使用全缓冲
        全缓冲使用malloc来分配缓冲区
行缓冲
        系统遇到换行符时进行真正的I/O操作。
        Terminal一般使用行缓冲
        行缓冲有固定的size,当这个固定size的行缓冲区被填满时,不管有没有遇到换行符都开始进行一次I/O操作。
        行缓冲在得到输入数据时,会自动刷新输出流。这里说的得到数据,指的时数据在输入流中, 并不要求输入的数据一定被内核读取了。
不带缓冲的流
        没有缓冲区,直接写入文件。
        标准错误流默认使用不带缓冲。
刷新flush
        在使用全缓冲或者行缓冲时,即使我们的缓冲区未被写满(全缓冲)、或者还没遇到换行符(行缓冲),(也就是还没达到进行真正I/O的默认条件),只要我们使用flush,那么就会立即执行I/O操作,将数据流填入内核。
  1. #include <stdio.h>
  2. int fflush(FILE *fp);

ISO C的要求

        标准输入、输出流:当且仅当I/O操作不涉及交互式设备的时候,使用全缓冲
        标准错误:永远不适用全缓冲(ps:应该是考虑遇到特殊故障,如果使用全缓冲可能无法记录错误,比如突然断电,可能缓冲区内            数据就无法进行记录。)
一般情况(Most implementation):
        标准错误:使用不带缓冲区的流
        其它流:涉及到Terminal时使用行缓冲,其它情况使用全缓冲

改变数据流缓冲类型

    setbuf和setvbuf可以用来改变数据流的缓冲类型
 
  1. #include <stdio.h>
  2. void setbuf(FILE *restrict fp,char *restrict buf);
  3. int setvbuf(FILE *restrict fp,char *restrictbuf,intmode,size_tsize);
  4. Returns: 0 if OK, nonzero on error

intmode 可以取以下值:
  1. _IOFBF fully buffered
  2. _IOLBF line buffered
  3. _IONBF unbuffered
setbuf和setvbuf的具体功能如Figure5.1所示:
bubuko.com,布布扣
    bubuko.com,布布扣
        对于setbuf来说,如果buf参数为空,则关闭数据流的缓冲功能;如果buf的值不为空,指向一个缓冲区,那么就将缓冲类型设置为全缓冲(一些系统实现了当数据流来自Terminal时,设置为行缓冲)
        对于setvbuf的_IPFBF和_IOLBF,如果buf为空,则为系统默认缓冲区,如果buf不为空,则使用用户自定义的缓冲区。

APUE学习笔记——5.4缓冲Buffering

标签:缓冲   buffer   全缓冲   行缓冲   setbuf   

原文地址:http://blog.csdn.net/windeal3203/article/details/38817525

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!