欢迎来到天天文库
浏览记录
ID:34472205
大小:538.19 KB
页数:19页
时间:2019-03-06
《unix高级编程5》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、下载第5章标准I/O库5.1引言本章说明标准I/O库。因为不仅在UNIX而且在很多操作系统上都实现此库,所以它由ANSIC标准说明。标准I/O库处理很多细节,例如缓存分配,以优化长度执行I/O等。这样使用户不必担心如何选择使用正确的块长度(如3.9节中所述)。标准I/O库是在系统调用函数基础上构造的,它便于用户使用,但是如果不较深入地了解库的操作,也会带来一些问题。标准I/O库是由DennisRitchie在1975年左右编写的。它是由MikeLesk编写的可移植I/O库的主要修改版本。令人惊异的是,15年后制订的标准I/O库对它只作
2、了极小的修改。5.2流和FILE对象在第3章中,所有I/O函数都是针对文件描述符的。当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后读的I/O操作。而对于标准I/O库,它们的操作则是围绕流(stream)进行的(请勿将标准I/O术语流与系统V的STREAMSI/O系统相混淆)。当用标准I/O库打开或创建一个文件时,我们已使一个流与一个文件相结合。当打开一个流时,标准I/O函数fopen返回一个指向FILE对象的指针。该对象通常是一个结构,它包含了I/O库为管理该流所需要的所有信息:用于实际I/O的文件描述符,指向流缓存
3、的指针,缓存的长度,当前在缓存中的字符数,出错标志等等。应用程序没有必要检验FILE对象。为了引用一个流,需将FILE指针作为参数传递给每个标准I/O函数。在本书中,我们称指向FILE对象的指针(类型为FILE*)为文件指针。在本章中,我们以UNIX系统为例,说明标准I/O库。正如前述,此标准库已移到除UNIX以外的很多系统中。但是为了说明该库实现的一些细节,我们选择UNIX实现作为典型进行介绍。5.3标准输入、标准输出和标准出错对一个进程预定义了三个流,它们自动地可为进程使用:标准输入、标准输出和标准出错。在3.2节中我们曾用文件描
4、述符STDIN_FILENO,STDOUT_FILENO和STDERR_FILENO分别表示它们。这三个标准I/O流通过预定义文件指针stdin,stdout和stderr加以引用。这三个文件指针同样定义在头文件中。5.4缓存标准I/O提供缓存的目的是尽可能减少使用read和write调用的数量(见表3-1,其中显示了在不同缓存长度情况下,为执行I/O所需的CPU时间量)。它也对每个I/O流自动地进行缓存管92UNIX环境高级编程下载理,避免了应用程序需要考虑这一点所带来的麻烦。不幸的是,标准I/O库令人最感迷惑的也
5、是它的缓存。标准I/O提供了三种类型的缓存:(1)全缓存。在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。对于驻在磁盘上的文件通常是由标准I/O库实施全缓存的。在一个流上执行第一次I/O操作时,相关标准I/O函数通常调用malloc(见7.8节)获得需使用的缓存。术语刷新(flush)说明标准I/O缓存的写操作。缓存可由标准I/O例程自动地刷新(例如当填满一个缓存时),或者可以调用函数fflush刷新一个流。值得引起注意的是在UNIX环境中,刷新有两种意思。在标准I/O库方面,刷新意味着将缓存中的内容写到磁盘上(该缓存可以只
6、是局部填写的)。在终端驱动程序方面(例如在第11章中所述的tcflush函数),刷新表示丢弃已存在缓存中的数据。(2)行缓存。在这种情况下,当在输入和输出中遇到新行符时,标准I/O库执行I/O操作。这允许我们一次输出一个字符(用标准I/Ofputc函数),但只有在写了一行之后才进行实际I/O操作。当流涉及一个终端时(例如标准输入和标准输出),典型地使用行缓存。对于行缓存有两个限制。第一个是:因为标准I/O库用来收集每一行的缓存的长度是固定的,所以只要填满了缓存,那么即使还没有写一个新行符,也进行I/O操作。第二个是:任何时候只要通过标
7、准输入输出库要求从(a)一个不带缓存的流,或者(b)一个行缓存的流(它预先要求从内核得到数据)得到输入数据,那么就会造成刷新所有行缓存输出流。在(b)中带了一个在括号中的说明的理由是,所需的数据可能已在该缓存中,它并不要求内核在需要该数据时才进行该操作。很明显,从不带缓存的一个流中进行输入((a)项)要求当时从内核得到数据。(3)不带缓存。标准I/O库不对字符进行缓存。如果用标准I/O函数写若干字符到不带缓存的流中,则相当于用write系统调用函数将这些字符写至相关联的打开文件上。标准出错流stderr通常是不带缓存的,这就使得出错信
8、息可以尽快显示出来,而不管它们是否含有一个新行字符。ANSIC要求下列缓存特征:(1)当且仅当标准输入和标准输出并不涉及交互作用设备时,它们才是全缓存的。(2)标准出错决不会是全缓存的。但是,这并没有告诉我们如果标准输入
此文档下载收益归作者所有