1.2 Linux标准 I/O概述
1.2.1 标准 I/O 的由来
标准 I/O 指的是 ANSI C 中定义的用于 I/O 操作的一系列函数。
只要操作系统中安装了 C 库,标准 I/O 函数就可以调用。换句话说,如果程序中使用的是标准 I/O 函数,那么源代码不需要修改就可以在其他操作系统下编译运行,具有更好的可移植性。
除此之外,使用标准 I/O 可以减少系统调用的次数,提高系统效率。标准 I/O 函数在执行时也会用到系统调用。在执行系统调用时,Linux 必须从用户态切换到内核态,处理相应的请求,然后再返回到用户态。如果频繁地执行系统调用会增加系统的开销。为了避免这种情况,标准 I/O 使用时在用户空间创建缓冲区,读写时先操作缓冲区,在合适的时机再通过系统调用访问实际的文件,从而减少了使用系统调用的次数。
1.2.2 流的含义
标准 I/O 的核心对象就是流。当用标准 I/O 打开一个文件时,就会创建一个 FILE 结构体描述该文件(或者理解为创建一个 FILE 结构体和实际打开的文件关联起来)。我们把这个 FILE 结构体形象地称为流。标准 I/O 函数都基于流进行各种操作。
标准 I/O 概述
标准 I/O 中的流的缓冲类型有以下3种。
(1)全缓冲。在这种情况下,当填满标准 I/O 缓冲区后才进行实际 I/O操作。对于存放在磁盘上的普通文件,用标准 I/O 打开时默认是全缓冲的。当缓冲区已满或执行 flush 操作时才会进行磁盘操作。
(2)行缓冲。在这种情况下,当在输入和输出中遇到换行符时执行 I/O操作。标准输入流和标准输出流就是使用行缓冲的典型例子。
(3)无缓冲。不对 I/O 操作进行缓冲,即在对流的读写时会立刻操作实际的文件。标准出错流是不带缓冲的,这就使得出错信息可以立刻显示在终端上,而不管输出的内容是否包含换行符。
下面讨论具体函数时,请读者注意区分以上的3种不同情况。