分类: 系统运维
2012-03-28 17:16:28
在第三章,所有的I/O函数都集中在文件描述符。当一个文件被打开时,会返回一个文件描述符,然后这个描述符会被所有的后续I/O操作使用。对于标准 I/O库,讨论主要集中在流(stream)。
(不要把标准I/O的术语“流”和作为System V的一部分的STREAMS I/O系统相混淆,后者在SUS的XSI STREAMS选项里被标准化。)当我们用标准I/O库打开或创建一个文件时,我们说我们有一这个文件的关联的流。
根据ASCII字符集,一个单一的字符由一个字节表示。根据国际字符集,一个字符可以由一个以上的字节来表示。标准I/O文件流可以用来操作单字节和多字 节(宽,wide)字符集。一个流的方向(orientation)决定了字符是以单字节还是多字节的方式读取。
初始地,当一个流被创建时,它没有方向。
如果一个多字节I/O函数(参考
fwdie函数根据mode参数的值,执行不同的任务:
1、如果mode参数为负值,fwide将会尝试让流面向字节;
2、如果mode参数为正值,fwide将会尝试让流面向宽字符;
3、如果mode参数为0,fwid将不会设置方向,而是返回一个表示流的方向的值。
注意fwide不会改变一个已经有方向的流的方向。同样注意它不会返回错误。考虑如果流无效时会发生什么。我们仅有的资源是在调用fwide之前清除errno,然后在它返回时查看errno的值。在本文的剩余部分,我们将只处理面向字节的流。
当我们打开一个流时,标准I/O函数fopen返回一个指向一个FILE对象的指针。这个对象通常是一个包含所有标准I/O库管理流所需的所有信息的结构 体。它包含:真实I/O使用的文件描述符、指向流的缓冲区的指针、缓冲区的大小、缓冲区当前字符数的计数器、一个错误标志,等等。
应用软件不应该需要检查FILE对象。为了引用流,我们把FILE指针作为一个参数传给每个标准I/O函数。在本文,我们将用一个FILE对象的指针(FILE *)作为文件指针。
在本章,我们在UNIX系统的上下文讲述标准I/O库。正如我们提到的那样,这个库已经广泛移植到其它操作系统上。然而为了展示这个库是怎么实现的,我们将讨论它在UNIX系统上的典型实现。