首页 > 其他分享 >文件描述符

文件描述符

时间:2023-06-28 14:57:27浏览次数:21  
标签:node 文件 ulimit 描述符 进程 打开

1、文件描述符是什么

文件描述符是内核为了高效管理已被打开的文件所创建的索引,是一个非负整数用于指代被打开的文件,所有执行I/O操作的系统调用都是通过文件描述符

在Linux系统中内核默认为每个进程创建三个标准的文件描述符:分别是0(标准输入)、1(标准输出)、2(标准错误)

打开文件后占用一个文件描述符3,后面是4...(分配未被占用的最小文件描述符)

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

除了文件描述符表,系统还需要维护另外两张表:

  • 打开文件表(Open file table)
  • i-node 表(i-node table)

文件描述符表每个进程都有一个,打开文件表和 i-node 表整个系统只有一个,它们三者之间的关系如下图所示

 通过文件描述符,可以找到文件指针,从而进入打开文件表。该表存储了以下信息:

  • 文件偏移量,也就是文件内部指针偏移量。调用 read() 或者 write() 函数时,文件偏移量会自动更新,当然也可以使用 lseek() 直接修改。
  • 状态标志,比如只读模式、读写模式、追加模式、覆盖模式等。
  • i-node 表指针。


然而,要想真正读写文件,还得通过打开文件表的 i-node 指针进入 i-node 表,该表包含了诸如以下的信息:

    • 文件类型,例如常规文件、套接字或 FIFO。
    • 文件大小。
    • 时间戳,比如创建时间、更新时间。
    • 文件锁。

 

2、查看文件描述符

查看进程的文件描述符

ll /proc/PID/fd

查看系统级别最大文件描述符数(一般为内存大小KB的10%)

cat /proc/sys/fs/file-max

查看用户级别最大文件描述符数

ulimit -u

 查看进程级别最大文件描述符数

ulimit -n

 

3、修改最大文件描述符数

为什么要限制打开的文件描述符?
原因1 – 资源问题:每个打开的文件都需要消耗内存来管理,而内存是有限的
原因2 – 安全问题:如果不限制的话,一个进程可以无限的创建和打开新的文件,会让服务器崩溃

3.1 修改系统级别

临时设置

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

 

永久设置

echo "fs.file-max=419430" >> /etc/sysctl.conf
#使用sysctl -p 即不需要重启系统也可以生效
sysctl -p

 

3.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    #最大描述符使用数量,超过输出错误

 

标签:node,文件,ulimit,描述符,进程,打开
From: https://www.cnblogs.com/Xinenhui/p/17511341.html

相关文章

  • 解决TrueNAS中Smb共享文件路径不区分大小写的问题
    问题在Truenas中,默认的smb文件分享中,文件夹是不区分大小写的.这在一些情况下会导致无法重命名等问题,严重时可能会造成拷贝文件时的全文件夹文件丢失.这是linux下的情况,在已存在others文件夹的情况下,若再新建Others文件夹,会提示目录已存在,但实际上两个目录大小写......
  • git 入门、reset的3种模式、回滚文件、还原文件、变基、merge
    git基础知识盗用网上的一张图,git有工作目录、索引区(也叫暂存区)、历史区,这3个区,一定要记在脑子里,基本上git所有的操作都是操作这3个区。新建一个文件并提交的一般操作是,新建文件gitadd到索引区gitcommit到历史区(添加-a参数会自动提交到索引区,相当于第2步+第3步)gitreset有3种......
  • asp.net http大文件断点续传上传
    ​ 需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。 第一步:前端修改由于项目使用的是BJUI前端框架,并没有使用框架本身的文件上传控件,而使用的基于jQuery的Uploadify......
  • 最佳被虐——Android混淆文件生成器
    直接上效果!混淆前;混淆后;使用获取混淆文件自己生成规则使用intellijidea打开 proguard-creater 工程编辑Main.java根据提示填写相应参数运行即可使用已有规则前往proguard-file 下载对应的文件即可Android工程配置开启混淆buildTypes{release{minifyEnabledt......
  • VUE http大文件断点续传上传
    ​ 对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多线程并发上传能够达到最大效率。 本文是基于springboot+vue实现的文件上传,本文主要介绍服务端实现文件......
  • Gitee通过本地git上传大于10M的文件教程
    Gitee通过网页端默认上传的文件需要小于10M,如上传10M-100M的文件需要通过本地git上传,此时需要使用git指令操作,步骤如下。首先创建一个文件夹,打开后右键使用gitbash功能分别进行简要步骤说明如下1-8,详细可见下图操作说明。1、gitinit初始化;2、gitremote绑定gitee仓库3、git......
  • 如何正确删除无法删除的windows系统文件
    需要两个步骤,且步骤严格按照1、2先后顺序。【删除系统文件,本地或者重新插入的盘,该操作存在风险,建议非必须勿操作】1、更改文件所有者授权为当前管理员账户:需要递归,则在以下命令后增加/R选项递归:takeown/f文件或文件夹/A2、修改管理员权限,增加所有的权限,包括读、写、修......
  • redis配置文件
    1)绑定的ip地址,多个ip用空格隔开bind127.0.0.12)端口,默认6379,一般不做修改port63793)是否以守护进程启动,默认为no,一般改为yes代表后台启动(windows系统不支持)daemonizeno4)定义日志级别,默认值为notice,有如下4种取值:debug(记录大量日志信息,适用于开发、测试阶段)verbose(较多日......
  • Git忽略部分修改的方法(.gitignore添加忽略文件不起作用的解决办法)
    背景:有时候本地修改,有些修改不需要提交上库,所以需要进行部分文件的修改进行忽略处理。 一、.gitignore方式忽略.gitignore文件中只能忽略本地新增的目录或者文件,这个文件默认会被提交上库,除非该文件添加了忽略自身。 二、.git/info/exclude方式忽略.git/info/exclude文件......
  • 如何将mp4文件解复用并且解码为单独的.yuv图像序列以及.pcm音频采样数据?
    一.初始化解复用器在音视频的解复用的过程中,有一个非常重要的结构体AVFormatContext,即输入文件的上下文句柄结构,代表当前打开的输入文件或流。我们可以将输入文件的路径以及AVFormatContext**format_ctx传入函数avformat_open_input(),就可以打开对应的音视频文件或流。接......