标准I/O缓冲机制读书笔记总结和理解

缓冲

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

 

标准I/O提供了三种类型的缓冲:

(1)、全缓冲。在这种情况下,在填满标准I/O缓冲区后才进行实际I/O操作。对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲的。

 

(2)、行缓冲。在这种情况下,当在输入的和输出中遇到换行符时,标准I/O库执行I/O操作。只有在写了一行之后才进行实际I/O操作。当流涉及一个终端时(例如标准输入和标准输出),通常使用行缓冲。对于行缓冲有两个限制。第一,因为标准I/O库用来收集每一行的缓冲区的长度是固定的,所以只要填满了缓冲区,那么还没有写一个换行符,出进行I/O听任。第二,任何时候只要通过标准I/O库从一个不带缓冲的流,或者一个行缓冲的流得到输入数据,那么不会造成冲洗所有行缓冲输出流。

 

(3)、不带缓冲。标准I/O不对字符进行缓冲存储。标准出错流stderr通常是不带缓冲,这就使得出错信息可以尽快显示出来,而不管它们是否含有一个换行符。

 

下面是比较重要的特征:

ISO C  要求下列缓冲特征:

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

2、标准出错决不会是全缓冲的。

3、标准出错默认是不带缓冲的。

4、如若是涉及终端设备的其他流,则它们是行缓冲的;否则是全缓冲的。

 

-----------------------------分割线--------------------------------------

看了上面的总结可能还是有点迷惑,可以结合两个例子理解一下行缓冲和全缓冲造成的问题。

第一个例子是来自《Unix网络编程 第3版》P144 《6.5批量输入》这一章节。这一章节阐述了为了提高性能而引入缓冲区机制的问题,说明了行缓冲与全缓冲的区别。看看这里,可以加深“当且仅当标准输入和标准输出并不涉及交互式设备时,它们才是全缓冲的。”、“对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲的。”的理解。

 

第二个例子是来自《Unix环境高级编程 2nd的15.4协同进程P410和P411的程序清单的问题。这一章节也是阐述了标准I/O缓冲机制所引入的问题。因为这个程序的标准输入是一个管道,所以系统默认是全缓冲的。(当且仅当标准输入和标准输出并不涉及交互式设备时,它们才是全缓冲的。)。

 

 

PS:《Unix网络编程 第3版》P153”拒绝服务型攻击”那里应该印刷错了,如果程序中调用是readline的话,服务器才会出问题。如果单纯是调用read是不会出现拒绝服务的情况。

详细帖子:http://bbs.chinaunix.net/forum-viewthread-tid-1331361.html

 

 

你可能感兴趣的:(Linux编程,读书笔记,操作系统)