Linux中的文件描述符与打开文件之间的关系,Li
分类:pc28.am神测网

在Linux通用I/O模型中,I/O操作体系函数(系统调用卡塔尔(قطر‎都以围绕一个称为文件陈说符的大背头张开。那不禁令人发生疑问:那些平头代表怎么样?叁个数值代表一个文本呢?随意传二个整数进去调用能够啊?

Linux中的文件呈报符与开荒文件之间的涉嫌

导读水源(kernel)利用文件汇报符(file descriptor)来拜见文件。文件汇报符是非负整数。展开现成文件或新建文件时,内核会重回二个文本汇报符。读写文件也须要运用文件呈报符来钦定待读写的文件。

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

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

接待关心我们的众生号:小菜学编制程序 (coding-fan)

Linux中的文件陈述符与开荒文件之间的涉及

导读根本(kernel)利用文件汇报符(file descriptor)来拜见文件。文件呈报符是非负整数。展开现有文件或新建文件时,内核会重临多个文本呈报符。读写文件也须要使用文件汇报符来钦点待读写的文书。

1. 概述

在Linux系统中总体皆能够看作是文本,文件又可分为:普通文书、目录文件、链接文件和装置文件。文件呈报符(file descriptor)是底子为了火速管理已被展开的文书所创设的目录,其是一个非负整数(经常是小寸头),用于替代被打开的公文,全部实施I/O操作的系统调用都经过文件叙述符。程序刚刚启航的时候,0是正统输入,1是正统输出,2是标准错误。若是此刻去开荒几个新的文件,它的文件陈诉符会是3。POSIX规范须要每趟展开文件时(含socket)必需选取当前历程中小小可用的文本陈诉符号码,因而,在互连网通讯过程中稍不检点就有希望变成串话。规范文件描述符图如下:**

图片 1

文本汇报与开辟的文件对应模型如下图:

图片 2

2. 文件陈述节制

在编写制定文件操作的依旧互联网通讯的软件时,初读书人平日可能会碰着“Too many open files”的难题。这根本是因为文件陈诉符是系统的一个至关心珍视要能源,固然说系统内享有多少就足以展开多少的公文描述符,不过在实际上得以达成过程中底蕴是会做相应的管理的,日常最大张开文件数会是系统内部存款和储蓄器的10%(以KB来测算)(称之为系统级限定),查看系统等第的最大展开文件数可以应用sysctl -a | grep fs.file-max命令查看。与此同期,内核为了不让某四个经过消耗掉全数的文本财富,其也会对单个进程最大张开文件数做默许值管理(称之为客商级节制),私下认可值日常是1024,使用ulimit -n命令能够查阅。在Web服务器中,通过改造系统暗中同意值文件呈报符的最大值来优化服务器是最遍布的章程之意气风发,具体优化措施请查看

3. 文本陈说相符张开文件之间的涉嫌

每叁个文书陈述符会与三个开发文件相对应,同期,不一样的公文汇报符也会针对同几个文件。相近的文书能够被不一致的进度展开也足以在同一个经过中被屡次开拓。系统为各类历程维护了叁个文书陈述符表,该表的值都以从0开始的,所以在不相同的进度中你拜望到同样的文本描述符,这种景观下同样文件汇报符有相当大希望指向同贰个文本,也会有相当大可能率指向不相同的文书。具体意况要具体深入分析,要领悟具体其大致怎么着,须要查阅由基本功维护的3个数据构造。

  1. 进度级的文件陈述符表

  2. 系统级的开发布文书件叙述符表

  3. 文件系统的i-node表

进度级的描述符表的每一规规矩矩记录了单个文件陈诉符的连锁音信。

1. 说了算文件叙述符操作的意气风发组标记。(近些日子,此类标识仅定义了一个,即close-on-exec标识)

  1. 对展开文件句柄的援引

根本对具备展开的文书的文件维护有二个系统级的叙说符表格(open file description table)。临时,也可以称作展开文件表(open file table),并将表格中各条目款项称为张开文件句柄(open file handle)。叁个开采文件句柄存款和储蓄了与叁个展开文件有关的全体音信,如下所示:

  1. 一时文件偏移量(调用read(卡塔尔国和write(卡塔尔国时更新,或选用lseek(卡塔尔国直接改进)

  2. 打开文件时所利用的情事标识(即,open(卡塔尔(قطر‎的flags参数)

  3. 文本访谈格局(如调用open(卡塔尔(قطر‎时所设置的只读方式、只写方式或读写方式)

  4. 与非能量信号驱动相关的设置

  5. 对该公文i-node对象的引用

  6. 文件类型(举例:常规文件、套接字或FIFO)和做客权限

  7. 贰个指南针,指向该文件所怀有的锁列表

  8. 文本的种种品质,包蕴文件大小以致与分化类型操作相关的年华戳

下图展现了文件描述符、张开的文书句柄以至i-node之间的关联,图中,三个进程具备众多开荒的文本呈报符。

图片 3

在经过A中,文件陈诉符1和30都指向了同八个开荒的文件句柄(标号23)。这大概是经过调用dup(卡塔尔国、dup2(卡塔尔、fcntl(卡塔尔(قطر‎恐怕对同二个文件一再调用了open(卡塔尔函数而产生的。

进度A的文本汇报符2和经过B的公文汇报符2都指向了同四个开拓的文件句柄(标号73)。这种意况大概是在调用fork(卡塔尔国后现身的(即,进程A、B是父亲和儿子进程关系),或许当某过程经过UNIX域套接字将一个开垦的文书叙述符传递给另三个进度时,也会发出。再者是分化的经过独自去调用open函数张开了同一个文书,那个时候进程之中的汇报符刚巧分配到与别的进度张开该公文的叙说符相仿。

其它,进度A的汇报符0和经过B的叙说符3分别指向差异的开荒文件句柄,但这几个句柄均指向i-node表的同等条目款项(1977),换言之,指向同多少个文本。发生这种情景是因为每一种进度各自对同一个文件发起了open(卡塔尔调用。同二个经过四回展开同二个文本,也会时有发生相仿景况。

4. 总结

1. 出于进度级文件陈述符表的留存,不一致的进度中会现身相同的文本描述符,它们大概指向同四个文书,也恐怕指向不相同的文件

2. 八个例外的文本描述符,若指向同一个开发布文书件句柄,将分享同一文件偏移量。因而,若是经过中间多个文书叙述符来更正文件偏移量(由调用read(卡塔尔、write(卡塔尔国或lseek(卡塔尔国所致),那么从另多个陈诉符中也会考查到变化,无论那多少个公文陈说符是或不是归属区别进程,依然同三个进度,情形都以如此。

3. 要拿走和校正开发的文本评释(举个例子:O_APPEND、O_NONBLOCK和O_ASYNC),可执行fcntl()的F_GETFL和F_SETFL操作,其对作用域的限定与上一条颇为类似。

4. 文书呈报符标记(即,close-on-exec)为经过和文书陈说符所私有。对那生龙活虎标识的改良将不会耳濡目染平等进程或不一样进度中的别的文件汇报符


原著来自:

正文地址:

底子(kernel)利用文件呈报符(file descriptor)来拜见文件。文件汇报符是非负整数。张开现有文件或新建文件时,内核会重返叁个文书陈述符。读写文件也急需选拔文件呈报符来钦赐待读写的公文。

1. 概述

在Linux系统中全部皆能够看成是文本,文件又可分为:普通文书、目录文件、链接文件和装置文件。文件陈述符(file descriptor)是幼功为了急速管理已被展开的公文所创设的目录,其是一个非负整数(日常是小板寸),用于代替被展开的文本,全体执行I/O操作的系统调用都经过文件呈报符。程序刚刚启航的时候,0是规范输入,1是专门的学问输出,2是专门的学问错误。固然那个时候去开垦五个新的文本,它的公文呈报符会是3。POSIX标准须求每一遍展开文件时(含socket)必需接收当前路程中微小可用的文书呈报符号码,因而,在互联网通讯进度中稍不留意就有相当的大希望招致串话。标准文件描述符图如下:**

图片 4

文本呈报与开发的文本对应模型如下图:

图片 5

2. 文本呈报节制

在编辑文件操作的或许互连网通讯的软件时,初读书人日常只怕会高出“Too many open files”的标题。那至关心保养假诺因为文件汇报符是系统的多少个首要能源,即便说系统内具备多少就足以张开多少的文书描述符,然而在骨子里得以达成进度中基本是会做相应的管理的,平日最大张开文件数会是系统内部存款和储蓄器的十分一(以KB来计量)(称之为系统级约束),查看系统级其余最大张开文件数能够选拔sysctl -a | grep fs.file-max命令查看。与此同有的时候间,内核为了不让某一个进程消耗掉全部的文件财富,其也会对单个进度最大张开文件数做暗中同意值管理(称之为客户级约束),暗中认可值经常是1024,使用ulimit -n命令能够查阅。在Web服务器中,通过更动系统默许值文件汇报符的最大值来优化服务器是最布满的措施之蓬蓬勃勃,具体优化措施请查看

3. 文书陈说适合展开文件之间的关联

每二个文件陈述符会与四个开垦文件相对应,同时,区别的文书呈报符也会针对同一个文本。相似的公文能够被不相同的进程打开也得以在同一个进度中被每每张开。系统为每二个经过维护了二个文件陈诉符表,该表的值都以从0带头的,所以在差异的进程中你会见到相仿的文书描述符,这种地方下相近文件陈说符有极大概率指向同一个文书,也会有非常大希望指向差别的公文。具体意况要具体解析,要掌握具体其大概怎么样,必要查阅由根底维护的3个数据布局。

  1. 进程级的文本陈诉符表

  2. 系统级的开垦文件陈述符表

  3. 文件系统的i-node表

进度级的叙说符表的每一条文记录了单个文件汇报符的连锁消息。

1. 垄断文件陈诉符操作的大器晚成组标识。(近年来,此类标识仅定义了贰个,即close-on-exec标记)

  1. 对展开文件句柄的援引

底工对负有展开的公文的文件维护有二个系统级的陈诉符表格(open file description table)。有时,也叫做张开文件表(open file table),并将表格中各条约称为展开文件句柄(open file handle)。二个开荒文件句柄存款和储蓄了与叁个开荒文件有关的漫天音信,如下所示:

  1. 近期文件偏移量(调用read(卡塔尔(英语:State of Qatar)和write(卡塔尔时更新,或应用lseek(卡塔尔(قطر‎直接改革)

  2. 开荒文件时所使用的情状标记(即,open(卡塔尔国的flags参数)

  3. 文本访谈方式(如调用open(卡塔尔时所设置的只读方式、只写格局或读写方式)

  4. 与时限信号驱动相关的装置

  5. 对该公文i-node对象的援引

  6. 文件类型(举例:常规文件、套接字或FIFO)和拜会权限

  7. 三个指南针,指向该文件所具备的锁列表

  8. 文本的各个质量,包括文件大小以至与不一样等级次序操作相关的年月戳

下图显示了文本描述符、张开的公文句柄以致i-node之间的涉及,图中,多少个进程具备广大开垦的文书陈说符。

图片 6

在进程A中,文件呈报符1和30都指向了同二个开拓的公文句柄(标号23)。那只怕是通过调用dup(卡塔尔(قطر‎、dup2(卡塔尔、fcntl(卡塔尔国只怕对同三个文件每每调用了open(卡塔尔函数而变成的。

进度A的文书陈诉符2和经过B的文本陈诉符2都指向了同三个开荒的公文句柄(标号73)。这种景况只怕是在调用fork(卡塔尔(英语:State of Qatar)前边世的(即,进度A、B是父亲和儿子进度关系),大概当某进度经过UNIX域套接字将一个开垦的公文叙述符传递给另二个进程时,也会发出。再者是不一样的经过独自去调用open函数展开了同一个文书,那时候历程之中的描述符正巧分配到与别的进度张开该文件的陈述符相近。

别的,进度A的陈说符0和经过B的陈诉符3分别指向分裂的开发布公文件句柄,但那几个句柄均指向i-node表的如出生龙活虎辙条目(壹玖柒玖),换言之,指向同一个文本。产生这种情景是因为各类过程各自对同七个文书发起了open(卡塔尔调用。同二个经过四遍伸开同七个文本,也会发生看似场馆。

4. 总结

1. 是因为进度级文件陈说符表的存在,不一致的进度中会现身契合的文书描述符,它们恐怕指向同一个文书,也可以有可能指向差异的公文

2. 四个例外的文书描述符,若指向同三个开垦文件句柄,将分享同一文件偏移量。由此,假若经过中间三个文本陈说符来校勘文件偏移量(由调用read(卡塔尔(英语:State of Qatar)、write(卡塔尔(英语:State of Qatar)或lseek(卡塔尔所致),那么从另三个陈诉符中也会考察到变化,无论那四个文件叙述符是还是不是归于区别进度,还是同一个进度,景况都以这么。

3. 要得到和改正开发的文本注解(举例:O_APPEND、O_NONBLOCK和O_ASYNC),可执行fcntl()的F_GETFL和F_SETFL操作,其对功效域的牢笼与上一条颇为形似。

4. 文书陈说符标识(即,close-on-exec)为经过和文书叙述符所私有。对那生机勃勃标识的改革将不会影响相仿进度或差别进度中的别的文件汇报符


原来的文章来自:

转发地址:

Linux中的文件陈诉符与开垦文件之间的关系 导读 内核(kernel)利用文件呈报符(file descriptor)来...

1. 概述

解答上述难点,供给更加深切学习——文件汇报符(File Descriptor卡塔尔(قطر‎。

在Linux系统中全数皆可以作为是文件,文件又可分为:普通文书、目录文件、链接文件和装置文件。文件呈报符(file descriptor)是底工为了连忙管理已被展开的文本所创办的目录,其是一个非负整数(平常是小卡尺头),用于代替被展开的文书,所有实践I/O操作的种类调用都经过文件陈说符。程序刚刚启航的时候,0是行业内部输入,1是正规输出,2是正规错误。若是那个时候去开采八个新的文书,它的文本陈诉符会是3。POSIX规范供给每趟展开文件时(含socket)必需运用当前路程中微小可用的文本汇报符号码,由此,在互联网通讯进度中稍不上心就有异常的大可能率变成串话。标准文件描述符图如下:

图解

清楚具体景况,须要领会由基本维护的3个数据布局:

  • 进程级文件呈报符表(file descriptor table)
  • 系统级开采文件表(open file table)
  • 文件系统i-node表(i-node table)

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

图片 7

图片 8

文件陈诉符表

根基为各种进度维护三个文件汇报符表,该表每一规行矩步都记录了单个文件呈报符的相关音信,满含:

  • 调整标识(flags卡塔尔国,最近幼功仅定义了一个,即close-on-exec
  • 开垦文件陈说体指针

文本陈说与开辟的文本对应模型如下图:

开拓文件表

根基对持有张开的文件维护一个种类级其他张开文件描述表(open file description table),简称开采文件表。表中条约称为展开文件描述体(open file description卡塔尔(قطر‎,存储了与三个展开文件有关的成套新闻,富含:

  • 文本偏移量(file offset),调用read()write()更新,调用lseek()直接改变
  • 做客格局,由open()调用设置,举例:只读、只写或读写等
  • i-node指标指针

图片 9

i-node表

每种文件系统会为存款和储蓄于其上的享有文件(满含目录卡塔尔(英语:State of Qatar)维护三个i-node表,单个i-node含蓄以下消息:

  • 文件类型(file type卡塔尔国,可以是正规文件、目录、套接字或FIFO
  • 寻访权限
  • 文本锁列表(file locks)
  • 文件大小
  • 等等

i-node存款和储蓄在磁盘设备上,内核在内部存款和储蓄器中维护了三个别本,这里的i-node为继承者。别本除了原有音讯,还蕴涵:引用计数(从张开文件描述体卡塔尔(قطر‎、所在设备号以至部分临时性质,举个例子文件锁。

2. 文件叙述限定

情景解析

上海体育地方中,详细描述了八个过程大多文本描述符,以致相互关系。

在编排文件操作的也许互连网通讯的软件时,初学者经常大概会境遇“Too many open files”的难点。那关键是因为文件叙述符是系统的三个重视能源,虽说说系统内享有多少就能够展开多少的公文陈诉符,但是在其实落实进程中基本是会做相应的管理的,日常最大展开文件数会是系统内部存款和储蓄器的十一分黄金年代(以KB来总计)(称之为系统级约束),查看系统级其余最大打开文件数可以接纳sysctl -a | grep fs.file-max命令查看。与此同一时间,内核为了不让某叁个进度消耗掉全体的文书财富,其也会对单个进度最大张开文件数做暗中认可值管理(称之为顾客级节制),私下认可值日常是1024,使用ulimit -n命令可以查阅。在Web服务器中,通过更动系统默许值文件呈报符的最大值来优化服务器是最广泛的方式之后生可畏,具体优化措施请查看。

文件陈诉符复制

在进程A中,文件呈报符1和文书陈诉符20都照准同二个开荒文件描述体(标号23卡塔尔(قطر‎。那很大概是经过调用dup()多种函数变成的。

文本汇报符复制,在某个场景下特别常有用,例如:规范输入/输出重定向。在shell下,达成那么些操作特别轻巧,大部分人都会,不过极少人斟酌过专断的规律。

差不离陈述一下急需的多少个步骤,以职业输出(文件陈说符为1卡塔尔(英语:State of Qatar)重定向为例:

  1. 开发目的文件,重回文件呈报符n;
  2. 关门文件陈诉符1;
  3. 调用dup将文件陈诉符n复制到1;
  4. 闭馆文件汇报符n;

3. 文本叙述契合张开文件之间的涉及

子进度继续文件叙述符

进程A的文件汇报符2和经过B的公文陈说符2都对准同四个张开文件描述体(标号73卡塔尔。这种情状很恐怕发生在调用fork()派生子进程之后,举例A调用fork()派生出B。这时,B作为子进程,从父进度A三回九转了文本陈述符表,当中包含图中标记的文本陈说符2。那正是子进程继承父进程打开的文件那句话的由来。

当然了,进程A通过Unix套接字将二个文本陈说符传递给B也会现出相同的意况,但平常文件汇报符数值是不等同的。同时为2要那多少个恰巧才发出。

每多少个文件呈报符会与二个开荒文件相对应,同一时候,分歧的文本陈诉符也会指向同叁个文件。相符的公文能够被差别的长河打开也足以在同一个进程中被反复开垦。系统为每一个经过维护了二个文书汇报符表,该表的值都以从0伊始的,所以在区别的历程中您拜候到同意气风发的文书描述符,这种气象下同样文件呈报符有超级大恐怕指向同叁个文本,也可能有十分的大概率指向分歧的文件。具体情形要具体剖析,要了然具体其大致怎样,须要查阅由基本维护的3个数据构造。

下一步

越来越多小说请访谈:学习Linux

订阅更新,获取越多读书资料,请关怀我们的 Wechat民众号 :

图片 10

图片 11

  1. 进程级的公文陈述符表

  2. 系统级的展开文件叙述符表

  3. 文件系统的i-node表

进程级的陈说符表的每一条文记录了单个文件呈报符的相关新闻。

1. 说了算文件呈报符操作的意气风发组标识。(近日,此类标记仅定义了二个,即close-on-exec标识)

  1. 对展开文件句柄的引用

根本对具备张开的文书的文件维护有一个系统级的叙说符表格(open file description table)。一时,也称得上展开文件表(open file table),并将表格中各条约称为打开文件句柄(open file handle)。贰个开垦文件句柄存款和储蓄了与三个展开文件有关的万事音讯,如下所示:

  1. 当下文件偏移量(调用read(卡塔尔(英语:State of Qatar)和write(卡塔尔(قطر‎时更新,或采纳lseek(卡塔尔国直接修改)

  2. 展开文件时所运用的情事标志(即,open(卡塔尔国的flags参数)

  3. 文本访问形式(如调用open(卡塔尔时所设置的只读形式、只写形式或读写情势)

  4. 与时限信号驱动相关的设置

  5. 对该公文i-node对象的援用

  6. 文件类型(比方:常规文件、套接字或FIFO)和做客权限

  7. 三个指南针,指向该文件所具有的锁列表

  8. 文本的各个品质,蕴含文件大小以至与区别类型操作相关的大运戳

下图展现了文件描述符、张开的文书句柄以致i-node之间的关联,图中,七个进程具备众多开采的文本汇报符。

图片 12

在经过A中,文件陈述符1和30都指向了同八个开采的文书句柄(标号23)。那可能是透过调用dup(卡塔尔(英语:State of Qatar)、dup2(卡塔尔国、fcntl(卡塔尔(قطر‎大概对同叁个文件一再调用了open()函数而变成的。

进度A的公文叙述符2和经过B的公文陈说符2都指向了同八个开荒的文书句柄(标号73)。这种情形只怕是在调用fork(卡塔尔(قطر‎后现身的(即,进度A、B是老爹和儿子进度关系),也许当某进度经过UNIX域套接字将三个开辟的文书陈诉符传递给另一个经过时,也会时有爆发。再者是莫衷一是的进度独自去调用open函数打开了同几个文件,当时进度之中的叙说符正巧分配到与其它进程张开该文件的描述符相仿。

别的,进度A的汇报符0和进度B的描述符3分别指向差别的开辟文件句柄,但那几个句柄均指向i-node表的平等条款(壹玖柒捌),换言之,指向同一个文书。爆发这种气象是因为各种进度各自对同一个文本发起了open(卡塔尔国调用。同一个进程若干回张开同叁个文书,也会生出看似情况。

4. 总结

1. 由于进度级文件陈述符表的留存,不一致的长河中会现身同等的文件描述符,它们大概指向同一个文件,也或者指向分化的文本

2. 四个区别的文件描述符,若指向同一个开发布公文件句柄,将分享同一文件偏移量。因而,假使通过中间四个文件叙述符来矫正文件偏移量(由调用read(卡塔尔(قطر‎、write(卡塔尔(قطر‎或lseek(卡塔尔(英语:State of Qatar)所致),那么从另二个陈诉符中也会考查到变化,无论那七个文本汇报符是或不是归于分化进程,依然同一个历程,景况都以那样。

3. 要拿走和退换开采的文书证明(举例:O_APPEND、O_NONBLOCK和O_ASYNC),可执行fcntl()的F_GETFL和F_SETFL操作,其对功效域的牢笼与上一条颇为近似。

4. 文书陈诉符标记(即,close-on-exec)为经过和文件陈述符所私有。对那一标识的退换将不会耳熏目染一样进度或分歧进程中的别的文件陈诉符

本文由pc28.am发布于pc28.am神测网,转载请注明出处:Linux中的文件描述符与打开文件之间的关系,Li

上一篇:xise官方网站 下一篇:没有了
猜你喜欢
热门排行
精彩图文
  • Linux中的文件描述符与打开文件之间的关系,Li
    Linux中的文件描述符与打开文件之间的关系,Li
    在Linux通用I/O模型中, I/O 操作体系函数(系统调用卡塔尔(قطر‎都以围绕一个称为文件陈说符的大背头张开。那不禁令人发生疑问:那些平头代表怎么样?
  • 享用Centos6.5进级glibc进程
    享用Centos6.5进级glibc进程
    暗许的Centos6.5 glibc版本最高为2.12,而在拓宽Nodejs开垦时项目所重视的包往往须要越来越高版本的glibc库补助,因而在不升官系统的前提下, 须求积极立异系统
  • 软件入门指南,用文本文件详细记录PS的每一步操
    软件入门指南,用文本文件详细记录PS的每一步操
    按“ WIN R ”,打开【运行】对话框; 输入“ regedit ”, 回车 ,张开注册表编辑器; 依次展开“ HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerRunMRU ”,
  • 01、Linux介绍
    01、Linux介绍
    一、 Linux介绍   Linux是后生可畏套免费应用和轻易传播的类Unix操作系统,是多个基于POSIX和UNIX的多顾客、多任务、支持多线程和多CPU的操作系统。它能运作
  • 10十个最强大通用快捷键
    10十个最强大通用快捷键
    Windows操作系统效能充足,可视化的分界面可以扶助大家加强工效。可是,平日行使中,比非常多客户都习贯“一头鼠标走天下”,频仍的点击让手指力倦神