深入理解计算机系统 第十章

输入 / 输出 (I/O) 是在主 存和外 部设备 (例 如磁盘 驱动器 、终端 和网络 ) 之间 复制数 据的过程。 输人操 作是从 I/O 设备复 制数据 到主存 ,而输 出操作 是从主 存复制 数据到 I/O 设备。

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

普通文件 (regular file) 包含任 意数据 。应 用程序 常常要 区分文 本文件 (text file) 和二进 制文件 (binary file), 文本 文件是 只含有 ASCII 或 Unicode 字符 的普通 文件; 二进制文 件是所 有其他 的文件 。对内 核而言 , 文本文 件和二 进制文 件没有 区别。

目录 (directory) 是 包含一 组链接 (link) 的文件 ,其 中每个 链接都 将一个 文件名(filename) 映射 到一个 文件, 这个文 件可能 是另一 个目录 。每 个目录 至少含 有两个条目 : 是 到该目 录自身 的链接 ,以及 是到 目录层 次结构 (见 下文) 中父目录 (parentdirectory) 的链接 。你 可以用 mkdir 命令 创建一 个目录 ,用 Is 查 看其内容 ,用 rmdir 删除该目录。

接字 (socket) 是 用来与另一个 进程进 行跨网 络通信 的文件

目录 层次结 构中的 位置用 路径名 (pathname) 来指定 。路 径名 是一个 字符串 ,包 括一个可 选斜杠 ,其后 紧跟一 系列的 文件名 ,文 件名之 间用斜 杠分隔 。路径 名有两 种形式 :

绝对 路径名 (absolute pathname) 以 一个 斜 杠开始 ,表示 从根节 点开始 的路径 。

对 路径名 (relative pathname) 以文件 名开始 ,表 示从 当前工 作目录 开始的 路径。

每个文件打开后都会得到一个描述符,描述符为一个无符号int数字,存储在一张描述符表中。同一文件多次被打开描述符不同。

描述符:

每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也会指向同一个文件。相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开。系统为每一个进程维护了一个文件描述符表,该表的值都是从0开始的,所以在不同的进程中你会看到相同的文件描述符,这种情况下相同文件描述符有可能指向同一个文件,也有可能指向不同的文件。具体情况要具体分析,要理解具体其概况如何,需要查看由内核维护的3个数据结构。

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。

习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。尽管这种习惯并非Unix内核的特性,但是因为一些 shell 和很多应用程序都使用这种习惯,因此,如果内核不遵循这种习惯的话,很多应用程序将不能使用。

POSIX 定义了 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 来代替 0、1、2。这三个符号常量的定义位于头文件 unistd.h。

文件描述符的有效范围是 0 到 OPEN_MAX。一般来说,每个进程最多可以打开 64 个文件(0 — 63)。对于 FreeBSD 5.2.1、Mac OS X 10.3 和 Solaris 9 来说,每个进程最多可以打开文件的多少取决于系统内存的大小,int 的大小,以及系统管理员设定的限制。Linux 2.4.22 强制规定最多不能超过 1,048,576 。

文件描述符是由无符号整数表示的句柄,进程使用它来标识打开的文件。文件描述符与包括相关信息(如文件的打开模式、文件的位置类型、文件的初始类型等)的文件对象相关联,这些信息被称作文件的上下文。

描述符解释来自百度百科

内核 用三个 相关的 数据结 构来表 示打开 的文件 :

描述符表 (descriptor table)ÿ 每个 进程都 有它独 立的描 述符表 ,它的 表项是 由进程打开的 文件描 述符来 索引的 。每 个打开 的描述 符表项 指向文 件表中 的一个 表项。

文 件表 (file table)ÿ 打开文 件的集 合是由 一张文 件表来 表示的 ,所有 的进程 共享这张表 。每 个文件 表的表 项组成 (针对 我们的 目的) 包括当 前的文 件位置 、引 用计数(reference count)( 即当前 指向该 表项的 描述符 表项数 ), 以及 一 个指向 v-node 表中对 应表项 的指针 。关 闭一个 描述符 会减少 相应的 文件表 表项中 的引用 计数。 内核不会 删除这 个文件 表表项 ,直到 它的引 用计数 为零。

v-node 表 (v-nodetable)同文件 表一样 ,所 有的 进程共 享这张 v-node 表。 每个表项包含 stat 结构中 的大多 数信息 ,包括 st_mode 和 st_size 成员。


Linux shell 提供了 I/O 重定向 操作符 ,允 许用户 将磁盘 文件和 标准输 人输出 联系起来 。可重定向也是基于这三张表进行相应的操作


你可能感兴趣的:(深入理解计算机系统 第十章)