我的编程空间,编程开发者的网络收藏夹
学习永远不晚

linux fd指的是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

linux fd指的是什么

本篇内容主要讲解“linux fd指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux fd指的是什么”吧!

在linux中,fd全称“File descriptor”,中文名为“文件描述符”,它是内核为了高效管理这些已经被打开的文件所创建的一种索引;它其实是一个非负整数,用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符来实现。

本教程操作环境:linux5.9.8系统、Dell G3电脑。

在linux中,fd全称“File descriptor”,中文名为“文件描述符”。文件描述符是一个非负整数,本质上是一个索引值(这句话非常重要)。

Linux中的文件描述符(fd)

我们知道在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。在操作这些所谓的文件的时候,我们每操作一次就找一次名字,这会耗费大量的时间和效率。所以Linux中规定每一个文件对应一个索引,这样要操作文件的时候,我们直接找到索引就可以对其进行操作了。

文件描述符(file descriptor)就是内核为了高效管理这些已经被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符来实现。同时还规定系统刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。这意味着如果此时去打开一个新的文件,它的文件描述符会是3,再打开一个文件文件描述符就是4......

Linux内核对所有打开的文件有一个文件描述符表格,里面存储了每个文件描述符作为索引与一个打开文件相对应的关系,简单理解就是下图这样一个数组,文件描述符(索引)就是文件描述符表这个数组的下标,数组的内容就是指向一个个打开的文件的指针。linux fd指的是什么

上面只是简单理解,实际上关于文件描述符,Linux内核维护了3个数据结构

  • 进程级的文件描述符表

  • 系统级的打开文件描述符表

  • 文件系统的i-node表

一个 Linux 进程启动后,会在内核空间中创建一个 PCB 控制块,PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件。进程级的描述符表的每一条记录了单个进程所使用的文件描述符的相关信息,进程之间相互独立,一个进程使用了文件描述符3,另一个进程也可以用3。除了进程级的文件描述符表,系统还需要维护另外两张表:打开文件表、i-node 表。这两张表存储了每个打开文件的打开文件句柄(open file handle)。一个打开文件句柄存储了与一个打开文件相关的全部信息。

系统级的打开文件描述符表:

  • 当前文件偏移量(调用read()和write()时更新,或使用lseek()直接修改)

  • 打开文件时的标识(open()的flags参数)

  • 文件访问模式(如调用open()时所设置的只读模式、只写模式或读写模式)

  • 与信号驱动相关的设置

  • 对该文件i-node对象的引用,即i-node 表指针

文件系统的i-node表:

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

  • 一个指针,指向该文件所持有的锁列表

  • 文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳

文件描述符、打开的文件句柄以及i-node之间的关系如下图:

linux fd指的是什么

  • 在进程 A 中,文件描述符 1 和 20 都指向了同一个打开文件表项,标号为 23(指向了打开文件表中下标为 23 的数组元素),这可能是通过调用 dup()、dup2()、fcntl() 或者对同一个文件多次调用了 open() 函数形成的。

  • 进程 A 的文件描述符 2 和进程 B 的文件描述符 2 都指向了同一个文件,这可能是在调用 fork() 后出现的(即进程 A、B 是父子进程关系),或者是不同的进程独自去调用 open() 函数打开了同一个文件,此时进程内部的描述符正好分配到与其他进程打开该文件的描述符一样。

  • 进程 A 的描述符 0 和进程 B 的描述符 3 分别指向不同的打开文件表项,但这些表项均指向 i-node 表的同一个条目(标号为 1976);换言之,它们指向了同一个文件。发生这种情况是因为每个进程各自对同一个文件发起了 open() 调用。同一个进程两次打开同一个文件,也会发生类似情况。

这就说明:同一个进程的不同文件描述符可以指向同一个文件;不同进程可以拥有相同的文件描述符;不同进程的同一个文件描述符可以指向不同的文件(一般也是这样,除了 0、1、2 这三个特殊的文件);不同进程的不同文件描述符也可以指向同一个文件。

Linux上打开文件举例

比如在Linux上用 vim test.py 打开一个文件,保持打开状态,再新打开一个新的shell,输入命令pidof vim 获取vim进程的pid号,然后 ll  /proc/$pid/fd 查看vim 进程所使用的文件描述符列表。

linux fd指的是什么

/dev/pts是远程登陆(telnet,ssh等)后创建的控制台设备文件所在的目录。因为我是通过Xshell远程登录的,所以标准输入0,标准输出1,标准错误2的文件描述符都指向虚拟终端控制台 /dev/pts/6 。再看下面是新打开的 test.py 的文件描述符,竟然是4,说好的从3开始呢?

这个我也困扰了好久,查了各种资料,终于在一个大佬的帮助下在一个论坛找到原因,有时候中文查不到还是要试试英文搜索啊。因为vim这种编辑器的原理是先打开源文件并拷贝,然后关闭源文件再打开自己的副本,修改完文件保存的时候直接将副本重命名覆盖源文件。所以打开源文件的时候用的文件描述符3,然后打开自己的副本是时候就该用文件描述符4了,然后关闭源文件,文件描述符3就被释放了,我们查看的时候就只剩下了4,这里它指向的是vim创建的副本文件。这里只是说个大概意思,具体深究要去深入了解一下 vim的实现原理——奥尔特星云大使,下面是当时我看到的论坛上的资料截图,链接在这:StackOverFlow。

linux fd指的是什么

如果不相信可以试一试别的进程,比如 tail。

在Linux上用 tail -f test.py 打开一个文件,保持打开状态,再新打开一个新的shell,输入命令pidof tail 获取tail进程的pid号,然后 ll  /proc/$pid/fd 查看tail进程所使用的文件描述符列表,可以看到文件描述符确实是从3开始使用的。tail不是编辑器不存在修改文件的情况,所以直接文件描述符直接打开的源文件。实际上可以使用 ll  /proc/$pid/fd 命令获取当前运行的任意进程的文件描述符使用情况。

linux fd指的是什么

扩展知识:Linux配置系统最大打开文件描述符个数

(1)系统级限制

理论上系统内存有多少就可以打开多少的文件描述符,但是在实际中内核是会做相应的处理,一般最大打开文件数会是系统内存的10%(以KB来计算),称之为系统级限制。这个数字可以通过 cat /proc/sys/fs/file-max 或者 sysctl -a | grep fs.file-max 命令查看。

linux fd指的是什么

更改系统级限制有临时更改和永久更改两种方式:

  • 临时更改:session断开或者系统重启后会恢复原来的设置值。使用命令 sysctl -w fs.file-max=xxxx,其中xxxx就是要设置的数字。

  • 永久更改:vim编辑 /etc/sysctl.conf 文件,在后面添加 fs.file-max=xxxx,其中xxxx就是要设置的数字。保存退出后还要使用sysctl -p 命令使其生效。

(2)用户级限制

同时为了控制每个进程消耗的文件资源,内核也会对单个进程最大打开文件数做默认限制,即用户级限制。32位系统默认值一般是1024,64位系统默认值一般是65535,可以使用 ulimit -n 命令查看。

linux fd指的是什么

更改用户级限制也有临时更改和永久更改两种方式:

  • 临时更改:session断开或者系统重启后会恢复原来的设置值。使用命令 ulimit -SHn xxxx 命令来修改,其中xxxx就是要设置的数字。

  • 永久更改:vim编辑 /etc/security/limits.conf 文件,修改其中的 hard nofile xxxxsoft nofile xxxx,其中xxxx就是要设置的数字。保存后退出。

到此,相信大家对“linux fd指的是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

linux fd指的是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

linux fd指的是什么

本篇内容主要讲解“linux fd指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux fd指的是什么”吧!在linux中,fd全称“File descriptor”,中文名为“文
2023-06-30

Linux 文件描述符 fd 是什么

这篇文章主要讲解了“Linux 文件描述符 fd 是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux 文件描述符 fd 是什么”吧!前情概要我们知道有两种文件读写的方式,一种是系
2023-06-15

Linux系统下fd分配的方法是什么

这篇文章将为大家详细讲解有关Linux系统下fd分配的方法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。最近几天在公司里写网络通讯的代码比较多,自然就会涉及到IO事件监测方法的问题。我
2023-06-16

fd()在Python中是什么意思

fd()在Python中是一个用于绘制图形的函数,用于控制海龟对象向前移动并在屏幕上绘制图形,它是绘制图形的基本操作之一,通过不同的参数可以实现不同长度的直线绘制。本文的操作环境:Windows10系统、python 3.11.2版本、DE
2023-08-10

linux disc指的是什么

这篇文章主要介绍了linux disc指的是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux disc指的是什么文章都会有所收获,下面我们一起来看看吧。在linux中,
2023-03-15

linux path指的是什么

今天小编给大家分享一下linux path指的是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
2023-04-14

linux mem指的是什么

今天小编给大家分享一下linux mem指的是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
2023-04-20

linux tmpfs指的是什么

本篇内容主要讲解“linux tmpfs指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux tmpfs指的是什么”吧!在linux中,tmpfs是指
2023-04-20

linux buffer指的是什么

本文小编为大家详细介绍“linux buffer指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux buffer指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
2023-04-27

linux core指的是什么

这篇文章主要介绍“linux core指的是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux core指的是什么”文章能帮助大家解决问题。在linux中,C
2023-04-27

linux mtu指的是什么

这篇文章主要介绍了linux mtu指的是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux mtu指的是什么文章都会有所收获,下面我们一起来看看吧。linux mtu是
2023-03-02

linux oops指的是什么

本篇内容主要讲解“linux oops指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux oops指的是什么”吧!linux oops的意思是指当L
2023-03-02

linux sudo指的是什么

本文小编为大家详细介绍“linux sudo指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux sudo指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在linux中,sudo全称“su
2023-06-30

linux ldconfig指的是什么

本文小编为大家详细介绍“linux ldconfig指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux ldconfig指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。linux ldc
2023-07-05

linux ibus指的是什么

这篇文章主要介绍“linux ibus指的是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux ibus指的是什么”文章能帮助大家解决问题。IBus是GNU/Linux和类UNIX操作系统
2023-07-05

linux more指的是什么

本文小编为大家详细介绍“linux more指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux more指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在linux中,more的意思为“
2023-07-02

linux mono指的是什么

今天小编给大家分享一下linux mono指的是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。linux mono是指X
2023-07-05

linux fuse指的是什么

本篇内容主要讲解“linux fuse指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux fuse指的是什么”吧!Linux用于支持用户空间文件系统
2023-04-20

linux pam指的是什么

这篇文章主要介绍“linux pam指的是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux pam指的是什么”文章能帮助大家解决问题。在linux中,PAM
2023-04-27

linux os指的是什么

本篇内容介绍了“linux os指的是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在linux中,OS是
2023-02-14

编程热搜

目录