文件描述符

来源:互联网 发布:lua脚本php 编辑:程序博客网 时间:2024/05/22 14:59

liunx设计思想就是一切皆文件,网络是文件,键盘等外设也是文件,所有的资源统一的接口,开发者可以像写文件那样通过网络传输数据,可以通过/proc/的文件看到进程资源的使用情况。
内核给每个访问的文件分配了文件描述符,它本质是一个非负整数,在打开或者新建文件时返回,以后读写文件都要通过这个文件描述符。

简单归纳:fd只是一个整数,在open时产生。起到一个索引的作用,进程
posix定义了stdin_fileno,stdout_fileno和stderr_fileno三个常量,也就是0,1,2.这三个文件描述符每个进程都有。

文件描述符帮助应用找到这个文件,而文件的打开模式等上下文信息存储在文件对象中,这个对象直接与文件描述符关联。

附注:每个系统对文件描述符的个数都有限制。我们网上看到配置ulimit也是为了调大系统的打开文件个数,因为一般服务器都要同时处理成千上万个请求,记住scoket连接也是文件。

理解具体情况,需要了解有内核维护3个数据结构
1、进程级文件描述符表(file descriptor table)
每一条目录都记录了当文件描述符的相关信息。
2、系统级打开文件表(open file table)
内核对所有打开的文件维护一个系统级别的打开文件描述表(open file description table),简称打开文件表。表中条目称为打开文件描述体(open file description),存储了与一个打开文件相关的全部信息。
3、文件系统i-node表(i-node table)
每个文件系统为存储于其上的所有文件(包括目录)维护一个i-node表。

这里写图片描述