在Linux通用I/O模型中,I/O操作类别函数(系统调用)都以围绕3个名叫文件讲述符的平头展开。那不禁令人发出疑问:那一个平头代表怎么着?一个数值代表五个文书呢?随便传二个整数进去调用能够呢?

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

Linux中的文件讲述符与开拓文件之间的涉及

导读根本(kernel)利用文件讲述符(file
descriptor)来访问文件。文件讲述符是非负整数。打开现存文件或新建文件时,内核会重临二个文本讲述符。读写文件也急需选取文件讲述符来内定待读写的公文。

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

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

欢迎关切大家的东风标致号:小菜学编制程序 (coding-fan)

在Linux通用I/O模型中,I/O操作类别函数(系统调用)都是环绕2个名叫文件讲述符的整数展开。那不禁令人爆发难点:那些平头代表怎样?贰个数值代表叁个文书呢?随便传三个平头进去调用能够呢?

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. 文书讲述吻合打开文件之间的关系

每三个文本讲述符会与三个打开文件相呼应,同时,差异的文件讲述符也会指向同七个文书。相同的文本能够被不相同的经过打开也能够在同3个历程中被频仍开拓。系统为每二个进程维护了贰个文本讲述符表,该表的值都以从0早先的,所以在不一致的进程中你会看出同一的公文描述符,那种意况下一致文件讲述符有恐怕指向同1个文件,也有恐怕指向分化的文本。具体情形要具体分析,要知道具体其大致怎么着,需求查阅由基本维护的二个数据结构。

  1. 经过级的文书讲述符表

  2. 系统级的开拓文件讲述符表

  3. 文件系统的i-node表

经过级的描述符表的每一条款记录了单个文件讲述符的连锁消息。

1.
决定文件讲述符操作的一组标志。(近日,此类标志仅定义了三个,即close-on-exec标志)

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

基本对富有打开的文本的文件维护有一个系统级的讲述符表格(open file
description table)。有时,也称之为打开文件表(open file
table),并将表格中各条目称为打开文件句柄(open file
handle)。叁个打开文件句柄存款和储蓄了与1个开辟文件有关的整套新闻,如下所示:

  1. 当前文件偏移量(调用read()和write()时更新,或应用lseek()直接改动)

  2. 开拓文件时所采纳的景况标识(即,open()的flags参数)

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

  4. 与信号驱动相关的安装

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

  6. 澳门金沙国际,文件类型(例如:常规文件、套接字或FIFO)和访问权限

  7. 2个指南针,指向该公文所持有的锁列表

  8. 文件的各类性能,包含文件大小以及与差别档次操作相关的岁月戳

下图浮现了文本描述符、打开的文件句柄以及i-node之间的关联,图中,七个进程具有众多开拓的公文讲述符。

澳门金沙国际 3

在进程A中,文件讲述符1和30都指向了同三个开辟的文书句柄(标号23)。这只怕是透过调用dup()、dup2()、fcntl()只怕对同2个文件反复调用了open()函数而形成的。

进度A的文本讲述符2和经过B的文本讲述符2都指向了同一个开辟的文件句柄(标号73)。那种地方或者是在调用fork()后出现的(即,进度A、B是父子进程关系),也许当某进度经过UNIX域套接字将多个开辟的文本讲述符传递给另四个经过时,也会发生。再者是例外的经过独自去调用open函数打开了同3个文书,此时经过之中的讲述符正好分配到与其余进度打开该文件的叙说符一样。

除此以外,进度A的描述符0和进程B的叙述符3分别针对不一致的开拓文件句柄,但这么些句柄均指向i-node表的等同条目(一九八〇),换言之,指向同2个文书。发生那种景观是因为各类进程各自对同八个文本发起了open()调用。同三个进度一遍打开同3个文书,也会时有发生看似地方。

4. 总结

1.
出于进程级文件讲述符表的存在,区别的进度中会出现雷同的文本描述符,它们也许指向同1个文书,也恐怕指向分化的文件

2.
多个分裂的公文描述符,若指向同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”的题材。那主倘使因为文件讲述符是系统的多少人命关天能源,尽管说系统内拥有多少就足以打开多少的文本描述符,不过在实际上落实进度中根本是会做相应的拍卖的,一般最大打开文件数会是系统内部存储器的1/10(以KB来估测计算)(称之为系统级限制),查看系统级其余最大打开文件数能够采取sysctl
-a | grep
fs.file-max命令查看。与此同时,内核为了不让某八个进度消耗掉全体的文书财富,其也会对单个进度最大打开文件数做暗中认可值处理(称之为用户级限制),暗中认可值一般是1024,使用ulimit
-n命令能够查看。在Web服务器中,通过改变系统默许值文件讲述符的最大值来优化服务器是最广大的艺术之一,具体优化措施请查看

3. 文书讲述吻合打开文件之间的涉嫌

每二个文件讲述符会与八个开拓文件相对应,同时,不一样的文本讲述符也会指向同2个文书。相同的文件能够被区别的进度打开也得以在同一个经过中被反复打开。系统为每三个进度维护了贰个文书讲述符表,该表的值都是从0开头的,所以在分裂的历程中你会看到同样的文件描述符,这种意况下一样文件讲述符有恐怕指向同贰个文件,也有恐怕指向不相同的文书。具体情况要具体分析,要清楚具体其大致怎么着,需要查阅由基础维护的2个数据结构。

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

  2. 系统级的开拓文件讲述符表

  3. 文件系统的i-node表

进度级的描述符表的每一条款记录了单个文件讲述符的相关音信。

1.
说了算文件讲述符操作的一组标志。(近日,此类标志仅定义了一个,即close-on-exec标志)

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

水源对富有打开的公文的文件维护有一个系统级的叙述符表格(open file
description table)。有时,也叫做打开文件表(open file
table),并将表格中各条目称为打开文件句柄(open file
handle)。三个打开文件句柄存储了与1个开辟文件有关的一体音信,如下所示:

  1. 脚下文件偏移量(调用read()和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()后现身的(即,进度A、B是父子进度关系),可能当某进度经过UNIX域套接字将2个开拓的公文讲述符传递给另贰个历程时,也会时有产生。再者是不相同的长河独自去调用open函数打开了同2个文书,此时进度之中的讲述符正好分配到与别的进度打开该公文的描述符一样。

别的,过程A的描述符0和经过B的叙述符3分别针对不一样的开辟文件句柄,但那些句柄均指向i-node表的同样条目(一九七七),换言之,指向同一个文本。产生那种景观是因为各种进度各自对同1个文书发起了open()调用。同1个进程三回打开同叁个文本,也会发生类似处境。

4. 总结

1.
是因为进程级文件讲述符表的存在,不一样的进度中会出现雷同的文书描述符,它们只怕指向同二个文本,也说不定指向区别的公文

2.
四个不等的文书描述符,若指向同2个开拓文件句柄,将共享同一文件偏移量。由此,如果通过内部3个文件讲述符来修改文件偏移量(由调用read()、write()或lseek()所致),那么从另二个叙述符中也会观望到变化,无论那三个文本讲述符是不是属于不一样进度,依旧同2个进度,景况都以那样。

Linux中的文件讲述符与开拓文件之间的涉嫌,Linux文件讲述符。3.
要收获和改动开拓的文书申明(例如:O_APPEND、O_NONBLOCK和O_ASYNC),可执行fcntl()的F_GETFL和F_SETFL操作,其对功用域的自律与上一条颇为类似。

4.
文件讲述符标志(即,close-on-exec)为经过和文件讲述符所私有。对这一阐明的改动将不会潜移默化平等进度或差别进度中的其余文件讲述符


初稿来自:

转发地址:

Linux中的文件讲述符与开拓文件之间的涉及 导读
内核(kernel)利用文件讲述符(file descriptor)来…

1. 概述

解答上述难点,须求更透彻学习——文件讲述符(File Descriptor)。

解答上述难题,要求更尖锐学习——文件讲述符(File Descriptor)。

在Linux系统中总体皆能够看作是文件,文件又可分为:普通文书、目录文件、链接文件和装备文件。文件讲述符(file
descriptor)是内核为了急忙管理已被打开的文件所开创的目录,其是二个非负整数(平日是小平头),用于代替被打开的文本,全数执行I/O操作的连串调用都经过文件讲述符。程序刚刚启航的时候,0是专业输入,1是专业输出,2是明媒正娶错误。借使此时去开辟二个新的公文,它的公文讲述符会是3。POSIX标准供给每趟打开文件时(含socket)必须采用当前经过中幽微可用的公文讲述符号码,由此,在互连网通信进程中稍不留神就有或者导致串话。标准文件描述符图如下:

图解

领会具体情状,要求明白由基础维护的二个数据结构:

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

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

澳门金沙国际 7

图解

领会具体情形,须要精晓由基本维护的二个数据结构:

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

这个数据结构之间的涉及如下图所示:

fd-inode-diagram.png

澳门金沙国际 8

文本讲述符表

水源为每一个进程维护3个文本讲述符表,该表每一条款都记录了单个文件讲述符的连锁消息,包涵:

  • 操纵标志(flags),近来根本仅定义了1个,即close-on-exec
  • 打开文件讲述体指针

文本讲述符表

基础为每种进程维护3个文本讲述符表,该表每一条条框框都记录了单个文件讲述符的连锁消息,包含:

  • 控制标志(flags),最近基本仅定义了1个,即close-on-exec
  • 开辟文件讲述体指针

文本讲述与开拓的文本对应模型如下图:

打开文件表

基础对全数打开的文件维护三个种类级别的开辟文件描述表(open file
description
table),简称打开文件表。表中条目称为打开文件描述体(open file
description),存款和储蓄了与贰个打开文件有关的方方面面音信,包蕴:

  • 文本偏移量(file
    offset),调用read()write()更新,调用lseek()一贯改动
  • 做客格局,由open()调用设置,例如:只读、只写或读写等
  • i-node对象指针

开拓文件表

根本对富有打开的文件维护3个系统级其他开辟文件描述表(open file
description
table),简称开辟文件表。表中条目称为打开文件描述体(open file
description),存款和储蓄了与二个开拓文件有关的全体音讯,蕴涵:

  • 文本偏移量(file
    offset),调用read()write()更新,调用lseek()间接修改
  • 访问形式,由open()调用设置,例如:只读、只写或读写等
  • i-node对象指针

澳门金沙国际 9

i-node表

各样文件系统会为存款和储蓄于其上的具有文件(包涵目录)维护1个i-node表,单个i-node包含以下音讯:

  • 文件类型(file type),能够是平常文件、目录、套接字或FIFO
  • 走访权限
  • 文本锁列表(file locks)
  • 文件大小
  • 等等

i-node存款和储蓄在磁盘设备上,内核在内部存款和储蓄器中维护了一个副本,那里的i-node为后代。副本除了原有新闻,还包蕴:引用计数(从打开文件描述体)、所在设备号以及部分一时半刻性质,例如文件锁。

i-node表

各种文件系统会为存款和储蓄于其上的兼具文件(包罗目录)维护三个i-node表,单个i-node包涵以下音信:

  • 文件类型(file type),可以是例行文件、目录、套接字或FIFO
  • 访问权限
  • 文本锁列表(file locks)
  • 文件大小
  • 等等

i-node存款和储蓄在磁盘设备上,内核在内部存款和储蓄器中保证了二个副本,那里的i-node为继承者。副本除了原有消息,还包罗:引用计数(从打开文件描述体)、所在设备号以及一些临时性质,例如文件锁。

2. 文本讲述限制

气象解析

上航海用教室中,详细描述了七个进度诸多文件描述符,以及互相关系。

气象解析

上海体育场合中,详细描述了五个进度诸多文件描述符,以及相互关系。

在编写制定文件操作的依然互连网通讯的软件时,初学者一般只怕会遇见“Too many open
files”的题材。那重庆大学是因为文件讲述符是系统的2个最首要财富,纵然说系统内有着多少就足以打开多少的文书讲述符,可是在其实贯彻进程中基本是会做相应的处理的,一般最大打开文件数会是系统内部存款和储蓄器的一成(以KB来计量)(称之为系统级限制),查看系统级别的最大打开文件数能够采纳sysctl
-a | grep
fs.file-max命令查看。与此同时,内核为了不让某一个历程消耗掉全体的文书财富,其也会对单个进度最大打开文件数做暗中认可值处理(称之为用户级限制),暗中认可值一般是1024,使用ulimit
-n命令能够查阅。在Web服务器中,通过变更系统暗中认可值文件讲述符的最大值来优化服务器是最广泛的方法之一,具体优化措施请查看。

文本讲述符复制

在进程A中,文件讲述符1和文件讲述符20都对准同多少个开拓文件描述体(标号23)。这不小概是透过调用dup()名目繁多函数形成的。

文件讲述符复制,在一些场景下特别有用,比如:标准输入/输出重定向。在shell下,达成那些操作相当不难,大多数人都会,但是极少人考虑过专擅的规律。

大约讲述一下急需的多少个步骤,以规范输出(文件讲述符为1)重定向为例:

  1. 打开指标文件,重回文件讲述符n;
  2. 闭馆文件讲述符1;
  3. 调用dup将文件讲述符n复制到1;
  4. 关闭文件讲述符n;

文件讲述符复制

在进程A中,文件讲述符1和文书讲述符20都针对同多少个开拓文件描述体(标号23)。那很大概是由此调用dup()层层函数形成的。

文件讲述符复制,在少数场景下卓殊有用,比如:标准输入/输出重定向。在shell下,实现那个操作极度简单,大多数人都会,不过极少人想想过私自的原理。

约莫讲述一下亟需的多少个步骤,以正规化输出(文件讲述符为1)重定向为例:

  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套接字将3个文书讲述符传递给B也会并发类似的事态,但貌似文件讲述符数值是不一致等的。同时为2要格外凑巧才发生。

子进度继续文件讲述符

进程A的文本讲述符2和进程B的公文讲述符2都指向同3个开辟文件描述体(标号23)。那种气象很也许发生在调用fork()派生子进度之后,比如A调用fork()派生出B。这时,B作为子进度,从父进度A继承了文本讲述符表,在那之中包蕴图中标明的文书讲述符2。那便是子进程继承父进程打开的文件那句话的由来。

当然了,进程A通过Unix套接字将三个文件讲述符传递给B也会油但是生类似的图景,但一般文件讲述符数值是不平等的。同时为2要十三分凑巧才爆发。

每1个文本讲述符会与三个打开文件相呼应,同时,区别的文件讲述符也会指向同一个文本。相同的文本可以被分化的长河打开也得以在同三个进度中被反复打开。系统为每1个经过维护了三个文书讲述符表,该表的值都以从0先导的,所以在不相同的进度中您会看到同一的文件描述符,这种情景下同样文件讲述符有或者指向同贰个文书,也有大概指向分歧的文书。具体情形要具体分析,要领悟具体其大致如何,必要查阅由基础维护的三个数据结构。

下一步

更多小说请访问:学习Linux

订阅更新,获取越来越多学习资料,请关怀大家的 微信公众号 :

澳门金沙国际 10

澳门金沙国际 11

  1. 进程级的文件讲述符表

  2. 系统级的打开文件讲述符表

  3. 文件系统的i-node表

进度级的讲述符表的每一条文记录了单个文件讲述符的连锁音讯。

1.
操纵文件讲述符操作的一组标志。(近期,此类标志仅定义了一个,即close-on-exec标志)

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

基本对具备打开的文本的文件维护有1个系统级的描述符表格(open file
description table)。有时,也叫做打开文件表(open file
table),并将表格中各条目称为打开文件句柄(open file
handle)。一个打开文件句柄存款和储蓄了与2个开辟文件有关的方方面面音信,如下所示:

  1. 现阶段文件偏移量(调用read()和write()时更新,或行使lseek()直接修改)

  2. 开拓文件时所使用的情状标识(即,open()的flags参数)

  3. 文件访问格局(如调用open()时所设置的只读形式、只写形式或读写情势)

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

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

  6. 文件类型(例如:常规文件、套接字或FIFO)和走访权限

  7. 贰个指针,指向该公文所独具的锁列表

  8. 文件的各个质量,包蕴文件大小以及与不一致体系操作相关的年月戳

下图体现了文本描述符、打开的文件句柄以及i-node之间的涉及,图中,四个经过具有广大打开的文书讲述符。

澳门金沙国际 12

在进程A中,文件讲述符1和30都指向了同1个打开的文件句柄(标号23)。那大概是经过调用dup()、dup2()、fcntl()大概对同2个文本反复调用了open()函数而形成的。

进度A的文本讲述符2和经过B的公文讲述符2都指向了同贰个开辟的文件句柄(标号73)。这种情状大概是在调用fork()后出现的(即,进度A、B是父子进度关系),只怕当某进程经过UNIX域套接字将多个开拓的文件讲述符传递给另三个进程时,也会发出。再者是区别的经过独自去调用open函数打开了同三个文书,此时进程之中的叙述符正好分配到与任何进程打开该公文的叙说符一样。

除此以外,进度A的叙述符0和进程B的叙述符3分别指向不相同的开拓文件句柄,但那些句柄均指向i-node表的同一条目(1978),换言之,指向同2个文件。爆发那种情景是因为各种进程各自对同1个文本发起了open()调用。同二个进程一遍打开同1个文件,也会发生看似地方。

4. 总结

1.
由于进度级文件讲述符表的留存,分裂的历程中会出现一样的文书描述符,它们或许指向同3个文本,也恐怕指向分化的文件

2.
四个差异的文件描述符,若指向同3个开拓文件句柄,将共享同一文件偏移量。由此,假使通过内部多个文书讲述符来修改文件偏移量(由调用read()、write()或lseek()所致),那么从另三个讲述符中也会观望到变化,无论这五个文件讲述符是或不是属于不相同进度,仍然同三个历程,景况都以那样。

3.
要获得和改动开拓的文书申明(例如:O_APPEND、O_NONBLOCK和O_ASYNC),可执行fcntl()的F_GETFL和F_SETFL操作,其对功效域的牢笼与上一条颇为类似。

4.
文本讲述符标志(即,close-on-exec)为经过和文书讲述符所私有。对这一标明的修改将不会影响同样进度或分化进程中的别的文件讲述符

相关文章