输入/输出(I/O) 是在主存和外部设备之间复制数据的过程。输入操作是从 I/O 设备复制到主存,输出操作是从主存复制到 I/O 设备。

1. Unix I/O

一个 Linux 文件就是一个 m 个字节的序列。所有的 I/O 设备都被模型化为文件,所有的输入和输出都被当作相应文件的读和写来执行。这种将设备优雅地映射为文件的方式,允许 Linux 内核引出一个简单、低级的应用接口,称为 Unix I/O。

2. 文件

每个 Linux 文件都有一个类型来表明它在系统中的角色:

  • 普通文件包含任意数据。
  • 目录是包含一组链接的文件。
  • 套接字是用来与另一个进程进行跨网络通信的文件。

Linux 内核将所有文件都组织称一个目录层次结构,由名为 / 的根目录确定。

Linux 目录层次结构

作为其上下文的一部分,每个进程都有一个当前工作目录,来确定其在目录层次结构中的当前位置。

3. 用 RIO 包健壮地读写

应用程序不该直接使用 Unix I/O 函数,而应该使用 RIO 包。RIO 包提供了两类不同的函数:无缓冲的输出输出函数和有缓冲的输入函数。RIO 包通过反复执行读写操作,直到传送完所有的请求数据,自动处理不足值。

4. I/O 重定向

Linux shell 提供了 I/O 重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。例如:

linux> ls > foo.txt

5. 该使用哪些 I/O 函数

标准 I/O 库是基于 Unix I/O 实现的,并提供了一组强大的高级 I/O 例程。对于大多数应用程序而言,标准 I/O 更简单,是优于 Unix I/O 的选择。然而,因为 Unix I/O 和网络文件之间有些相互不兼容的限制,Unix I/O 更适合用于网络应用程序。