在Linux通用I/O模型中,I/O操作连串函数(系统调用)都以围绕三个誉为文件陈说符的大背头展开。那不由得令人发出疑问:那一个平头代表如何?叁个数值代表一个文件呢?随便传三个整数进去调用能够吧?

原稿地址:https://learn-linux.readthedocs.io

玩转Linux旧群已满,请加新群:278378501

招待关怀大家的大伙儿号:小菜学编制程序 (coding-fan)

解答上述难题,必要更加尖锐学习——文件汇报符(File Descriptor)。

图解

领会具体情形,须要了然由底工维护的3个数据结构:

  • 进程级文本陈说符表(file descriptor table)
  • 系统级开辟文件表(open file table)
  • 文件系统i-node表(i-node table)

那3个数据结构之间的关系如下图所示:

www.512.net 1

文件叙述符表

底工为各个进程维护二个文本陈述符表,该表每一规规矩矩都记录了单个文件呈报符的连锁新闻,包涵:

  • 调节标记(flags),如今基本仅定义了叁个,即close-on-exec
  • 开采文件陈述体指针

张开文件表

水源对持有打开的文件维护八个系统品级的开垦文件描述表(open file
description
table),简称开垦文件表。表中条款称为开采文件描述体(open file
description),存款和储蓄了与三个开荒文件有关的成套音信,包罗:

  • 文本偏移量(file
    offset),调用read()write()更新,调用lseek()一向改良
  • 访问形式,由open()调用设置,比方:只读、只写或读写等
  • i-node目的指针

i-node表

每一个文件系统会为存款和储蓄于其上的有所文件(富含目录)维护叁个i-node表,单个i-node富含以下消息:

  • 文件类型(file type),可以是健康文件、目录、套接字或FIFO
  • 做客权限
  • 文件锁列表(file locks)
  • 文件大小
  • 等等

i-node仓库储存在磁盘设备上,内核在内部存款和储蓄器中维护了一个副本,这里的i-node为后代。别本除了原有音信,还富含:援用计数(从张开文件描述体)、所在设备号以致一些一时半刻性质,比如文件锁。

此情此景拆解深入分析

上海体育地方中,详细描述了多个经过好多文本描述符,以至彼此关系。

文本呈报符复制

在进程A中,文件叙述符1和文书陈说符20都指向同多个开垦文件描述体(标号23)。那很可能是因此调用dup()五颜六色函数变成的。

文件陈诉符复制,在少数场景下极其有用,比如:标准输入/输出重定向。在shell下,完毕那一个操作特轻松,半数以上人都会,不过极少人观念过专断的规律。

大要呈报一下亟待的多少个步骤,以正规化输出(文件陈说符为1)重定向为例:

  1. 展开目的文件,重回文件汇报符n;
  2. 关门文件汇报符1;
  3. 调用dup将文件叙述符n复制到1;
  4. 关闭文件汇报符n;

子进程继续文件叙述符

进程A的文书叙述符2和进程B的文件陈诉符2都对准同叁个张开文件描述体(标号73)。这种情况很或许爆发在调用fork()派生子进度之后,比如A调用fork()派生出B。这时,B用作子进程,从父进度A三番五次了文件陈说符表,在那之中包含图中标明的公文陈述符2。那正是子进程继承父进程打开的文件这句话的由来。

当然了,进程A通过Unix套接字将三个文书叙述符传递给B也会冷俊不禁相像的图景,但平日文件呈报符数值是不等同的。同期为2要特别恰巧才爆发。

下一步

更加的多小说请访问:学习Linux

订阅更新,获取越来越多读书材料,请关心大家的 Wechat大伙儿号 :

www.512.net 2

www.512.net 3