-
直接转换方法:将数据流图映射为模块结构图的实现细
资源介绍
5.12 实现细节
正如前述,在U N I X中,标准I / O库最终都要调用第3章中说明的I / O例程。每个I / O流都有一
个与其相关联的文件描述符,可以对一个流调用 f i l e n o以获得其描述符。
#include
int fileno(FILE *f p) ;
返回:与该流相关联的文件描述符
如果要调用d u p或f c n t l等函数,则需要此函数。
为了了解你所使用的系统中标准 I / O库的实现,最好从头文件 < s t d i o . h >开始。从中可以看
到:F I L E对象是如何定义的,每个流标志的定义,定义为宏的各个标准 I / O例程(例如g e t c)。
K e r n i g h a n和R i t c h i e〔1 9 8 8〕中的8 . 5节含有一个简单的实现,从中可以看到很多U N I X实现的基
本样式。P l a u g e r〔1 9 9 2〕的第1 2章提供了标准 I / O库一种实现的全部源代码。4 . 3+B S D中标准
I / O库的实现(由Chris To r e k编写)也是可以公开使用的。
实例
程序5 - 3为三个标准流以及一个与一个普通文件相关联的流打印有关缓存状态信息。注意,
在打印缓存状态信息之前,先对每个流执行 I / O操作,因为第一个 I / O操作通常就造成为该流分
配缓存。结构成员_ f l a g、_ b u f s i z以及常数_ I O N B F和_ I O L B F是由作者所使用的系统定义的。
如果运行程序 5 - 3两次,一次使三个标准流与终端相连接,另一次使它们重定向到普通文
件,则所得结果是:
$ a . o u t stdin, stdout 和s t d e rr 都连至终端
enter any character
键入新行符
one line to standard error
stream = stdin, line buffered, buffer size = 128
stream = stdout, line buffered, buffer size = 128
stream = stderr, unbuffered, buffer size = 8
stream = /etc/motd, fully buffered, buffer size = 8192
$ a.out < /etc/termcap > std.out 2> std.err
三个流都重定向,再次运行该程序
$ cat std.err
one line to standard error
$ cat std.out
enter any character
stream = stdin, fully buffered, buffer size = 8192
1 0 4 U N I X环境高级编程