Linux 系统中,把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。这个操作包含各种文件的读写,程序的输入输出等。
0x1 文件与文件描述符文件描述符最终对应的是文件,文件包含多种类型文件又可分为:普通文件、目录文件、链接文件和设备文件。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号码.
0x2 相互关系其中进程,文件,文件描述符的关系如下:
一个进程可以有多个文件描述符
一个文件可以由多个文件描述符对应,文件描述符可以是不同进程
一个文件描述符只能对应一个文件
具体关系图如下
第一列是用户态进程符号描述表,后两列是内核态系统级表项。具体从文件描述符到文件,先从文件描述符表开始索引,定位到文件句柄指针,接着找到打开文件表,存储着文件的状态,包括偏移,inode号等,不同的文件描述符可以指向相同的文件句柄指针(可用dup或dup2函数实现)。
0x3 操作指令lsof
lsof是列出系统所占用的资源(list open files),其中包括句柄资源。
lsof -a -p pid -d0,1,2,3#查看进程的文件描述符lsof -w -n #查看所有使用的文件
ulimit
ulimit主要是用来限制进程对资源的使用情况的,它支持各种类型的限制,包括打开文件句柄数限制。
ulimit -n #查看进程允许打开的最大文件句柄数
ulimit -n pid#设置进程能打开的最大文件句柄数
看完了内容,做个实验放松一下:Web操作系统基础-Linux
http://www.hetianlab.com/cour.do?w=1&c=C9d6c0ca797abec2017041916323500001
0x02 Shell中的文件描述符
在shell中使用的文件描述符总共有三种只读,只写,读写,参见下图:
在FD一列分别是u,w,r,其中u代表可读可写,一般来讲>代表写, hellocat - < helloecho "asd" > hello 2>&1
echo "asd" > hello 将标准输出重定向到文件,这样命令执行的结果会全部写在hello文件中。此命令等价于echo "asd">&hello
cat - < hello 将标准输入重定向到文件,cat - 意思是接受标准输入为文件进行输出,此命令等价于以下几个命令 cat hello | cat -
exec 0 hello 2>&1 ,主要是2>&1这个在下面的exec指令中会经常遇到,首先>&是赋值后者描述符的输出属性,helloexec 3&2exec 3&, ,
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录