现在的位置: 首页 > 综合 > 正文

标准I/O缓冲机制

2013年09月21日 ⁄ 综合 ⁄ 共 1144字 ⁄ 字号 评论关闭


转自:http://freakrobot.blogbus.com/logs/84071865.html


          标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。它对每个IO流自动的进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。不幸的是,标准IO库最令人迷惑的也是他的缓冲。


标准IO提供了3种缓冲机制:


(1)全缓冲。这种情况下,在填满标准IO缓冲区后才进行实际IO操作。对于驻留在磁盘文件上的文件通常是由标准IO库实现全缓冲的。在一个流上执行第一次IO操作时,相关标准IO函数常调用malloc获得需要使用的缓冲区。

      术语flush说明标准IO缓冲区的写操作。缓冲区可由标准IO例程自动flush(例如填满一个缓冲区时),或者可以调用函数fflush,flush一个一个流。值得注意的是在UNIX环境中,flush有两种意思。在标准IO库方面,flush意味着将缓冲区中的内容写到磁盘上。在终端驱动程序方面,flush表示丢弃已存储在缓冲区中的数据。


(2)行缓冲。在这种情况下,当输入和输出中遇到换行符时,标准IO库执行IO操作。这允许我们一次输出一个字符(fputc),但只有在谢了一行后才进行实际的IO操作。当流操作涉及一个终端时,通常使用行缓冲。

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


(3)不带缓冲。标准IO库不对字符进行缓冲存储。例如,如果用标准IO函数,fputs写15个字符到不带缓冲的一个流中,则该函数很可能用write系统调用函数将这些字符立即写到相关文件中。

标准出错流stderr通常是不带缓冲的,这就使得出错信息尽快显示出来。

ISO C要求下列缓冲特征:

 

  • 当且仅当标准输入和输出并不涉及交互式设备时,它们才是全缓冲的。
  • 标准出错流绝不会是全缓冲的。

 

不少系统默认的情况是:

 

  • 出错流不带缓冲
  • 如若涉及只能终端设备的其他流,则它们是行缓冲的,否则是全缓冲的。

  评: 

 

抱歉!评论已关闭.