Linux文件描述符

下一步

越来越多文章请访谈:学习Linux

订阅更新,获取越多学习材料,请关切我们的 Wechat民众号 :

图片 1

图片 2

文本陈说符表

基本为各种进程维护三个文本叙述符表,该表每一条文都记录了单个文件汇报符的有关音信,包蕴:

  • 决定标识(flags卡塔尔,最近基本仅定义了二个,即close-on-exec
  • 开发布公文件呈报体指针

地方分析

上海体育地方中,详细描述了八个进程好多文本描述符,甚至互相关系。

图解

清楚具体景况,须要精通由底工维护的3个数据构造:

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

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

图片 3

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

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

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

在Linux通用I/O模型中,I/O操作连串函数(系统调用卡塔尔(قطر‎都以围绕贰个称为文件陈述符的整数展开。那不由得令人产生难点:这一个平头代表怎么样?贰个数值代表三个文书呢?随意传三个卡尺头进去调用能够呢?

i-node表

每种文件系统会为存款和储蓄于其上的装有文件(包涵目录卡塔尔(قطر‎维护一个i-node表,单个i-node包涵以下消息:

  • 文件类型(file type卡塔尔(قطر‎,可以是健康文件、目录、套接字或FIFO
  • 访谈权限
  • 文件锁列表(file locks)
  • 文件大小
  • 等等

i-node积累在磁盘设备上,内核在内部存款和储蓄器中体贴了三个别本,这里的i-node为后代。别本除了原有音信,还包涵:援引计数(从展开文件描述体卡塔尔(قطر‎、所在设备号甚至部分一时性质,譬如文件锁。

解答上述难题,供给更通透到底学习——文件叙述符(File Descriptor卡塔尔。

子进程继续文件陈述符

进程A的公文汇报符2和进度B的文本汇报符2都照准同三个开辟文件描述体(标号73卡塔尔(英语:State of Qatar)。这种情形很恐怕发生在调用fork()派生子进度之后,举个例子A调用fork()派生出B。这时,B作为子进程,从父进度A接轨了文本陈诉符表,当中包含图中注明的文件陈述符2。这就是子进程继承父进程打开的文件那句话的由来。

当然了,进程A通过Unix套接字将二个文件叙述符传递给B也会师世就好像的景色,但通常文件陈说符数值是不近似的。同不常候为2要卓殊正巧才发出。

文件叙述符复制

在进程A中,文件陈说符1和文件汇报符20都指向同叁个开拓文件描述体(标号23卡塔尔(قطر‎。那很或者是透过调用dup()多重函数形成的。

文件陈说符复制,在某个场景下非常常有用,举例:规范输入/输出重定向。在shell下,完成这些操作特别轻易,超越53%人都会,可是极少人揣摩过私下的规律。

大概呈报一下须要的多少个步骤,以标准输出(文件汇报符为1卡塔尔重定向为例:

  1. 开辟指标文件,再次来到文件陈述符n;
  2. 关闭文件陈说符1;
  3. 调用dup将文件呈报符n复制到1;
  4. 闭馆文件陈诉符n;

开拓文件表

底工对具有展开的文件维护贰个体系等级的打开文件描述表(open file
description
table),简称开采文件表。表中条款称为开垦文件描述体(open file
description卡塔尔(قطر‎,存款和储蓄了与叁个开垦文件有关的上上下下音讯,包蕴:

  • 文件偏移量(file
    offset),调用read()write()更新,调用lseek()直白改造
  • 拜访情势,由open()调用设置,举例:只读、只写或读写等
  • i-node指标指针

发表评论

电子邮件地址不会被公开。 必填项已用*标注