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

输入 / 输出 (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个数据结构。

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

习惯上,标准输入(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 重定向 操作符 ,允 许用户 将磁盘 文件和 标准输 人输出 联系起来 。可重定向也是基于这三张表进行相应的操作


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343