Linux之文件描述符

一 文件描述符简介

Linux的设计中,不仅文件是文件,还将数据也抽象成了文件,甚至将一切操作和资源抽象成了文件,比如说socket,磁盘,进程,线程等,即所谓一切皆文件。

内核为了高效管理已被打开的文件,便创建了索引,用于指向被打开的文件。这样,要操作文件的时候,我们直接找到索引就可以对其进行操作了,我们将这个索引叫做文件描述符(file descriptor),简称fd,在系统里面是一个非负的整数。每打开或创建一个文件,内核就会向进程返回一个fd,第一个打开文件是0,第二个是1,依次递增。在Windows系统中,与文件描述符概念对应的东西称之为句柄。

在实际使用中,习惯上,0、1、2,这几个起始的文件描述符被占坑了,即标准输入输出,我们在执行管道的输出的重定向的时候经常涉及到。当然,如果你发神经,也可以将这几个文件描述符重新定义给其他文件使用。

文件描述符 0 与 进程的标准输入(standard input)关联

文件描述符 1 与 标准输出(standard output)关联,

文件描述符 2 与 标准错误(standard error)关联。

二 最大文件描述符

1 查看用户级最大文件描述符限制

ulimit为shell内建指令,可用来控制shell执行程序的资源。

语法

ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小>][-t <CPU时间>][-u <程序数目>][-v <虚拟内存大小>]

参数:

-a 显示目前资源限制的设定。

-c <core文件上限> 设定core文件的最大值,单位为区块。

-d <数据节区大小> 程序数据节区的最大值,单位为KB。

-f <文件大小> shell所能建立的最大文件,单位为区块。

-H 设定资源的硬性限制,也就是管理员所设下的限制。

-m <内存大小> 指定可使用内存的上限,单位为KB。

-n <文件数目> 指定同一时间最多可开启的文件数。

-p <缓冲区大小> 指定管道缓冲区的大小,单位512字节。

-s <堆叠大小> 指定堆叠的上限,单位为KB。

-S 设定资源的弹性限制。

-t <CPU时间> 指定CPU使用时间的上限,单位为秒。

-u <程序数目> 用户最多可开启的程序数目。

-v <虚拟内存大小> 指定可使用的虚拟内存上限,单位为KB。

显示目前资源限制的设定

ulimit -a
在这里插入图片描述

其中,文件描述符的限制,即open files,其限制值为1024,即同时只能打开1024个文件,该值为系统的默认值。

如果只是要查看文件描述符的限制,可直接使用命令:

ulimit -n

在这里插入图片描述

文件描述符的限制实际上分为硬限制和软限制,软限制受到硬限制的约束。

ulimit -Hn:查看硬限制

ulimit -Sn:查看软限制

在这里插入图片描述

2 查看系统级最大文件描述符限制

ulimit命令显示的是用户级的限制,要查看系统级的限制,请使用如下命令:

cat /proc/sys/fs/file-max

在这里插入图片描述

或者:

sysctl -a | grep file-max

在这里插入图片描述

系统级的限制默认值就已经非常大了。

3 查看某个进程的最大文件描述符限制

首先执行

ps-ef | grep [PName]

取得进程的PID

然后执行

cat /proc/[PID]/limits

显示结果的Max open files一行即为结果。

在这里插入图片描述

4 查看某个进程的文件描述符使用情况

首先执行

ps-ef | grep [PName]

取得进程的PID

然后执行

cd /proc/[PID]/fd

打开文件描述符目录

执行

ls -lR | grep “^l” | wc -l

即可统计出进程当前使用的文件描述符数目。

执行

ls -al

或者

ll

即可查看进程具体打开文件情况。

在这里插入图片描述

5 设置文件描述符的用户级限制

系统默认的最大文件描述符数目只有1024,很容易遇到error: too many open files。因此,我们一般会适当将其改大。

ulimit -n 65536
在这里插入图片描述

以上命令同时修改了最大文件描述符的软限制和硬限制。

ulimit -n 65536等效于ulimit -HSn 65536:同时修改软限制和硬限制。

ulimit -Hn 65536:仅修改硬限制

ulimit -Sn 65536:仅修改软限制

以上设置仅仅当前有效,系统重启后就无效了。要持久化配置,需修改配置文件。

vi /etc/security/limits.conf

在文件尾部增加如下内容:

root soft nofile 65535

root hard nofile 65535

  • soft nofile 65535

  • hard nofile 65535

在这里插入图片描述

修改配置后,配置在当前shell不会生效,关闭shell,重新打开shell后配置生效。

6 设置文件描述符的系统级限制

系统级的限制默认值已经非常大,一般不需要去管。

如果要修改系统级限制,请依次执行以下命令:

sysctl -w fs.file-max=758650

sysctl -p

等价于

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

sysctl -p

以上设置仅仅当前有效,系统重启后就无效了。要持久化配置,需修改配置文件:

vi /etc/sysctl.conf

添加如下内容:

fs.file-max=758650

然后执行:

sysctl -p

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值