一、概念

1.1 文件描述符&文件描述符表

文件描述符(file descriptor, fd)是Linux系统中对已打开文件的一个抽象标记,所有I/O系统调用对已打开文件的操作都要用到它。这里的“文件”仍然是广义的,即除了普通文件和目录外,还包括管道、FIFO(命名管道)、Socket、终端、设备等

文件描述符是一个较小的非负整数,并且0、1、2三个描述符总是默认分配给标准输入、标准输出和标准错误(即常用的 nohup test.sh > test.log 2>&1 & 的由来)

进程启动后,会在内核空间中创建一个 PCB 控制块,PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件。

表中每个条目包含两个域:
  • 控制该描述符的标记域(flags)
  • 指向系统级别的打开文件表中对应条目的指针
 

1.2 文件句柄&打开文件表

内核会维护系统内所有打开的文件及其相关的元信息,该结构称为打开文件表(open file table)。表中每个条目包含以下域:

  • 文件的偏移量。POSIX API中的read()/write()/lseek()函数都会修改该值
  • 打开文件时的状态和权限标记。通过open()函数的参数传入
  • 文件的访问模式(只读、只写、读+写等)通过open()函数的参数传入
  • 指向其对应的inode对象的指针

1.3 文件描述符表,打开文件表,inode表之间的关系

数字代表下标,不表示标准描述符

 
可见,一个打开的文件可以对应多个文件描述符(不管是同进程还是不同进程),一个inode也可以对应多个打开的文件
打开文件表中的一行称为一条文件描述(file description),也经常称为文件句柄(file handle)

二、文件描述符与文件句柄的限制

例如系统报错 too many open files ,实际是文件描述符数量有限

2.1 文件描述符

2.1.1 查看
#查看进程的文件描述符
ll /proc/PID/fd
lsof #查看进程级别最大文件描述符数
ulimit -n #查看用户级别最大文件描述符数
ulimit -u

#查看当前使用的文件描述符数
lsof -P -n | wc -l
2.1.2 修改

临时修改

ulimit -Sn
ulimit -Hn

永久修改(重启后生效)

vim /etc/security/limits.conf
#OPPO Standard limits config
root hard nofile unlimited #root用户最大描述符使用数量--无限
* soft nofile 20480000 #*表示所有用户,超过发出警告
* hard nofile 20480000 #最大描述符使用数量,超过输出错误

2.2 文件句柄

2.2.1 查看
#查看最大文件句柄打开数
cat /proc/sys/fs/file-max #三列数据分别为:已分配文件句柄的数目,已分配未使用文件句柄的数目,文件句柄的最大数目
cat /proc/sys/fs/file-nr
2.2.2 修改

临时修改

echo 6553500 > /proc/sys/fs/file-max

永久修改(使用sysctl -p 即不需要重启系统也可以生效)

echo "fs.file-max=419430" >> /etc/sysctl.conf
sysctl -p

文件描述符&文件句柄的更多相关文章

  1. 误删除innodb ibdata数据文件 文件句柄 文件描述符 proc fd

    误删除innodb ibdata数据文件  文件句柄  文件描述符  proc  fd http://www.cnblogs.com/gomysql/p/3702216.html 提示:如果不小心通过 ...

  2. 文件描述符 VS 文件句柄

    文件描述符 VS 文件句柄 文件描述符是标准 C 里用的,是 int 型的,比如调用 open 函数成功后会返回一个与当前文件相关联的 int 型数字. 文件句柄是 Windows 里用的,是 HAN ...

  3. 文件描述符FD的含义/文件句柄

    使用sudo lsof -nP -iTCP -sTCP:LISTEN查看占用端口的程序;因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能 概念 ...

  4. Linux文件描述符与打开文件之间的区别(转载)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239   1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为: ...

  5. linux文件描述符--转载

    转自:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录 ...

  6. Linux中的文件描述符与打开文件之间的关系

    Linux中的文件描述符与打开文件之间的关系 导读 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描 ...

  7. Linux下文件描述符

    http://blog.csdn.net/kumu_linux/article/details/7877770 文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket.第一个打开的 ...

  8. Linux中的文件描述符与打开文件之间的关系------------每天进步一点点系列

    http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件. ...

  9. [性能分析]linux文件描述符(转)

    1.什么是文件和文件描述符 Linux中文件可以分为4种:普通文件.目录文件.链接文件和设备文件.1.普通文件是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据.l ...

  10. (转)Linux中的文件描述符

    本文转自:http://blog.csdn.net/cywosp/article/details/38965239 作者:cywosp 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为 ...

随机推荐

  1. Android 11 后的应用数据和文件

    Android应用数据的保存方式有四种,分别是应用专属存储空间.共享存储.偏好设置.数据库. 应用专属存储空间 应用专属存储空间:存放应用专属文件,主要包括两个空间,卸载后移除 内部存储空间:位于系统 ...

  2. (数据科学学习手札155)基于martin为在线地图构建字体切片服务

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,在之前的一篇文章(基于mart ...

  3. 从零开始使用 ROS CDK 搭建云上解决方案

    作者: 金湛 前言 资源编排服务ROS(Resource Orchestration Service)是阿里云提供的一项简化云计算资源管理的服务.开发者和管理员可以编写模板,在模板中定义所需的阿里云资 ...

  4. 耗时三年开源的H5商城,生产级代码实战

    waynboot-mall 商城项目是我从疫情开始初期着手准备开发的,到如今 2023 年底,已经过了 3 年多的时间. 从项目初期到现在,一个人持续迭代,修复漏洞,添加功能,经历了前端开发工具从 v ...

  5. [GDOIpj221D] 小学生计数题

    第四题 小学生计数题 提交文件: counting.cpp 输入文件: counting.in 输出文件: counting.out 时间空间限制: 1 秒, 256 MB 作为 GDOI 的组题人, ...

  6. 项目实战接口开发SpringBoot

    目录 一.springboot官方demo开发 二.使用SpringBoot开发get方法接口 三.一个要求携带cookie信息访问的get接口开发 四.需要携带参数的get请求两种开发方式 4.1 ...

  7. bash shell笔记整理——cat命令

    cat命令的作用 简单来说cat命令用于查看文件内容,但是真正来说cat将给定的文件或者标准输入输出到标准输出中. 这个命令时会经常使用到的,不管是在shell脚本的编写还是linux运维测试中,ca ...

  8. Chrome扩展程序是如何进行消息传递的

    大家好,我是 dom 哥.这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星. 一个复杂的 Chrome 扩展程序通常由 content_scripts,background,ac ...

  9. Spring Boot 2.x 到 3.2 的全面升级指南

    Spring Framework 是一种流行的开源企业级框架,用于创建在 Java Virtual Machine (JVM) 上运行的独立.生产级应用程序.而Spring Boot 是一个工具,可以 ...

  10. 单位换算详解:bit、Byte、bps、Bps、pps、Gbps的单位详细说明及换算

    当谈论计算机存储和数据传输时,"bit"(比特)和"Byte"(字节)是两个常见的术语,它们具有不同的含义和用途. 位(bit):"位"来自 ...