Linux的文件描述符
(1).文件描述符的定义
文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;文件描述符是一个简单的非负整数,用以表明每个被进程打开的文件。程序刚刚启动时,第一个打开的文件是0,第二个是1,以此类推。也可以理解为文件的身份ID。
用户通过操作系统处理信息的过程中,使用的交互设备文件(键盘,鼠标,显示器)
| 文件描述符 | 通道名 | 描述 | 默认连接 | 用途 |
| 0 | stdin | 标准输入 | 键盘 | read only |
| 1 | stdout | 标准输出 | 终端 | write only |
| 2 | stderr | 标准错误 | 终端 | write only |
| 3以上 | filename | 其他文件 | none | read and/or write |
标准输入输出说明
stdin,标准输入,默认设备是键盘,文件编号为0
stdout,标准输出,默认设备是显示器,文件编号为1,也可以重定向到文件
stderr,标准错误,默认设备是显示器,文件编号为2,也可以重定向到文件
(2).查看一个进程打开了哪些文件
语法: ll /proc/[进程ID]/fd
[xf@xuexi ~]$ vim a.txt [1]+ 已停止 vim a.txt
[xf@xuexi ~]$ ps -aux | grep vim
xf 11990 0.6 0.2 151796 5396 pts/0 T 16:37 0:00 vim a.txt
xf 11998 0.0 0.0 112724 988 pts/0 S+ 16:37 0:00 grep --color=auto vim
[xf@xuexi ~]$ ll /proc/11990/fd
总用量 0
lrwx------. 1 xf xf 64 2月 21 16:37 0 -> /dev/pts/0
lrwx------. 1 xf xf 64 2月 21 16:37 1 -> /dev/pts/0
lrwx------. 1 xf xf 64 2月 21 16:37 2 -> /dev/pts/0
lrwx------. 1 xf xf 64 2月 21 16:37 4 -> /home/xf/.a.txt.swp
0、1、2也就是宏STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO。
/proc/[进程ID]/fd这个目录专门用于存放文件描述符
另外还可以使用ls -l /proc/self/fd。
(3).文件描述符限制
Linux中最大文件描述符的限制有两个方面,一个是用户级限制,一个是系统级限制。
但是,查看Linux文件描述符限制有三种方式:
[xf@xuexi ~]$ sysctl -a | grep file-max //过滤一下,不然参数太多不好找
sysctl: permission denied on key 'fs.protected_hardlinks'
sysctl: permission denied on key 'fs.protected_symlinks'
fs.file-max = 196630 //file-max其实是红色字体
sysctl: permission denied on key 'kernel.cad_pid'
sysctl: permission denied on key 'kernel.usermodehelper.bset'
sysctl: permission denied on key 'kernel.usermodehelper.inheritable'
sysctl: permission denied on key 'net.core.bpf_jit_harden'
sysctl: permission denied on key 'net.ipv4.tcp_fastopen_key'
sysctl: permission denied on key 'net.ipv6.conf.all.stable_secret'
sysctl: permission denied on key 'net.ipv6.conf.default.stable_secret'
sysctl: permission denied on key 'net.ipv6.conf.ens33.stable_secret'
sysctl: permission denied on key 'net.ipv6.conf.lo.stable_secret'
sysctl: permission denied on key 'net.ipv6.conf.virbr0.stable_secret'
sysctl: permission denied on key 'net.ipv6.conf.virbr0-nic.stable_secret'
sysctl: permission denied on key 'vm.mmap_rnd_bits'
sysctl: permission denied on key 'vm.mmap_rnd_compat_bits'
[xf@xuexi ~]$ cat /proc/sys/fs/file-max
196630
[xf@xuexi ~]$ ulimit -n
1024
用户级限制:ulimit命令看到的是用户级的最大文件描述符限制,也就是说每一个用户登录后执行的程序占用文件描述符的总数不能超过这个限制
系统级限制:sysctl命令与proc文件系统中查看到的数值是一样的,这属于系统级限制,它是限制所有用户打开文件描述符的总和。
1)修改用户级限制
临时修改上限,只对当前Shell有效
[xf@xuexi ~]$ ulimit -n //-n打开文件描述符的最大个数
1024
[xf@xuexi ~]$ ulimit -Sn //-S是软性限额
1024
[xf@xuexi ~]$ ulimit -Hn //-H是硬性限额
4096
[xf@xuexi ~]$ ulimit -n 2048 //可以看到在没有指定-S和-H选项时修改会同时修改软性和硬性限额
[xf@xuexi ~]$ ulimit -n
2048
[xf@xuexi ~]$ ulimit -Sn
2048
[xf@xuexi ~]$ ulimit -Hn
2048
[xf@xuexi ~]$ ulimit -Hn 4096
bash: ulimit: open files: 无法修改 limit 值: 不允许的操作
注意:硬性限额在设置好不能增加,除非使用root用户;软性限额可以增加,直到与硬性限额相等。
永久修改需要使用root用户编辑/etc/security/limits.conf。里面会有详细说明。修改文件描述符,应该注意<item>字段下是否存在nofile字段,如果存在请修改,不存在请添加。
* hard nofile 4096
* soft nofile 2048
添加完成后保存退出,重启系统,即可生效。
注意:soft一行中的<value>字段要小于或等于hard一行中的<value>字段。
2)修改系统限制级
修改系统限制级,不管是临时修改还是永久修改都需要使用root用户。
临时修改,重启后无效
//可以使用sysctl命令修改
[root@xuexi ~]# sysctl -w fs.file-max=8192
fs.file-max = 8192
[root@xuexi ~]# sysctl -a | grep fs.file-max
fs.file-max = 8192
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0-nic.stable_secret"
[root@xuexi ~]# cat /proc/sys/fs/file-max
8192
//也可以修改/proc/sys/fs/file-max文件
[root@xuexi ~]# cat >/proc/sys/fs/file-max <<EOF
> 16384
> EOF
[root@xuexi ~]# cat /proc/sys/fs/file-max
16384
[root@xuexi ~]# sysctl -a | grep fs.file-max
fs.file-max = 16384
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0-nic.stable_secret"
永久修改需要进入到/etc/sysctl.conf中,修改或添加fs.file-max=value,然后重启系统或使用sysctl -p重新读取参数。
[root@xuexi ~]# vim /etc/sysctl.conf
[root@xuexi ~]# sysctl -a | grep fs.file-max
fs.file-max = 196630
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0-nic.stable_secret"
[root@xuexi ~]# sysctl -p
fs.file-max = 10000
[root@xuexi ~]# sysctl -a | grep fs.file-max
fs.file-max = 10000
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0-nic.stable_secret"
注:有些人说root用户使用命令sysctl -w fs.file-max=10000,接着sysctl -p就可永久修改。可是我试下来重启系统后就会还原,有时间的可以试一下。
Linux的文件描述符的更多相关文章
- Linux中文件描述符fd和文件指针flip的理解
转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...
- Linux下文件描述符
http://blog.csdn.net/kumu_linux/article/details/7877770 文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket.第一个打开的 ...
- linux 最大文件描述符fd
使用四种框架分别实现百万websocket常连接的服务器 著名的 C10K 问题提出的时候, 正是 2001 年.这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是单机为1万个连接提供服务 ...
- [转载] linux中文件描述符fd和文件指针flip的理解
转载自http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...
- Linux Shell 文件描述符 及 stdin stdout stderr 重定向
Abstract: 1) Linux Shell 命令的标准输入.标准输出.标准错误,及其重定位: 2)Linux Shell 操作自定义文件描述符: 文件描述符是与文件相关联的一些整数,他们保持与已 ...
- linux 最大文件描述符
Linux对应用程序能打开的的最大文件描述符数量有两个层次的限制:用户级限制和系统级限制. 用户级限制是指目标用户运行的所有进程总共能打开的文件描述符数. 系统级的限制是指所有用户总共能打开的文件描述 ...
- linux下文件描述符的介绍
当某个程序打开文件时,操作系统返回相应的文件描述符,程序为了处理该文件必须引用此描述符.所谓的文件描述符是一个低级的正整数.最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出( ...
- 【详解】Linux的文件描述符fd与文件指针FILE*互相转换
使用系统调用的时候用文件描述符(file descriptor,简称fd)的时候比较多,但是操作比较原始.C库函数在I/O上提供了一些方便的包装(比如格式化I/O.重定向),但是对细节的控制不够. 如 ...
- [ 总结 ] Linux 下文件描述符
1.概述: 文件描述符是内核为了高效管理已被打开的文件所创建的索引.是一个非负整数,用于代指被打开的文件.所有通过I/O操作的系统调用都通过文件描述符. 文件描述符用以表明每一个被进程所打开的文件和s ...
随机推荐
- tomcat 启动报错 Cannot allocate memory
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=256m; support was removed in 8.0 ...
- UOJ#110. 【APIO2015】Bali Sculptures
印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 NN 座雕塑,为方便起见,我们把这些雕塑从 11 到 NN 连续地进行标号,其中第 ii 座雕塑的年龄是 YiYi 年 ...
- 20151024_003_C#基础知识(File / FileStream / StreamReader/StreamWriter)
1:绝对路径和相对路径 绝对路径:通过给定的路径直接能在我的电脑中找到这个文件. 相对路径:文件相对于应用程序的路径. 2:编码格式 乱码:产生乱码的原因,就是你保存这个文件所采用的编码,跟你打开这个 ...
- vue-cli proxyTable中跨域中pathRewrite 怎么用
问:proxyTable 里面的pathRewrite里面的‘^/iclient’:'' 什么意思? 答:用代理, 首先你得有一个标识, 告诉他你这个连接要用代理. 不然的话, 可能你的 html, ...
- js跨域上传文件 iframe
封装好的jq插件 (function () { var iframe = '<iframe name="jqUploadIframe" style="display ...
- poj 1837 Balance(背包)
题目链接:http://poj.org/problem?id=1837 Balance Time Limit: 1000MS Memory Limit: 30000K Total Submissi ...
- 使用Sysmon分析宏病毒(Macros Downloader)
样本为一个Word文件,Virustotal地址: https://www.virustotal.com/#/file/f8aede78ad92bd28f5f699b677d7d5fd362c8be8 ...
- MySQL当中的case when then
其实就相当于if else:而且也可以用if来替代. case whent 条件1 then 条件2 else 条件3 end; 如果条件1成立就执行条件2否则执行条件3 mysql ) end; + ...
- arm---先搞清楚各种版本号【转】
转自:http://blog.csdn.net/linnoo/article/details/53214689 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] ARM的几种版本 ...
- HDU 5117 Fluorescent
题目链接:HDU-5117 题意为有n盏灯,m个开关,每个开关控制着\( k_{i} \)灯.X为最后亮着的灯的个数,要求出\( E(X^{3} ) * 2^{M} mod (10^9 + 7) \) ...