当前位置: 首页 > Linux

Linux文件描述符

时间:2023-04-06 23:14:38 Linux

在Linux通用I/O模型中,I/O操作系列函数(系统调用)围绕着一个称为文件描述符的整数进行。这就引出了一个问题:这个整数代表什么?一个值代表一个文件吗?只传入一个整数并调用它可以吗?原文地址:https://learn-linux.readthedocs.io。玩转Linux老群已满,请加新群:278378501。欢迎关注我们的公众号:小菜学编程(coding-fan)回答以上问题,还需要学习更多——文件描述符(FileDescriptor)).要图形化地理解具体情况,需要了解内核维护的三种数据结构:进程级文件描述符表(filedescriptortable)、系统级打开文件表(openfiletable)、文件系统i节点表(i-nodetable)其中三种数据结构的关系如下图所示:文件描述符表内核为每个进程维护一个文件描述符表,表中的每一项记录了单个文件描述符的信息,包括:控制标志(flags),目前内核只定义了一个,即close-on-exec打开文件描述体指针打开文件表内核为所有的打开文件描述表(openfiledescriptiontable)维护了一个系统级的打开文件描述表(openfiledescriptiontable)打开文件,简称打开文件表。表中的条目称为打开文件描述体(openfiledescription),它存储了与一个打开文件相关的所有信息,包括:文件偏移量(fileoffset),调用read()和write()进行更新,调用lseek()直接修改访问模式,由open()调用设置,如:只读、只写或读写等i-node对象指针i-node表每个文件系统都会存储其上的所有文件(包括目录)维护一张i-node表,单个i-node包含以下信息:文件类型(filetype),可以是普通文件、目录、socket或FIFO访问权限文件锁列表(文件锁)、文件大小等i-node存储在一个磁盘设备上,内核在内存中维护一份副本,这里的i-node表就是后者。副本除了原始信息外,还包括:引用计数(来自打开的文件描述体),所在的设备号,以及一些临时属性,比如文件锁。场景分析上图详细描述了两个进程的众多文件描述符及其关系。文件描述符重复在进程A中,文件描述符1和文件描述符20都指向同一个打开的文件描述符(标号23)。这很可能是通过调用dup()系列函数形成的。文件描述符复制在某些场景中非常有用,例如标准输入/输出重定向。在shell下,完成这个操作非常简单,大多数人都能做到,但很少有人去思考背后的原理。简述所需步骤,以标准输出(文件描述符1)重定向为例:打开目标文件,返回文件描述符n;关闭文件描述符1;调用dup将文件描述符n复制到1;关闭文件描述符n;子进程继承文件描述符。进程A的文件描述符2和进程B的文件描述符2都指向同一个打开的文件描述符(标号73)。这种情况很可能发生在调用fork()fork一个子进程之后,比如A调用fork()fork了B,此时B作为子进程继承了父进程A的文件描述符表,包括图中标注的文件描述符2。这就是子进程继承父进程打开的文件这个说法的由来。当然,进程A通过Unixsocket传递一个文件描述符给B时也会出现类似的情况,只是一般的文件描述符值是不一样的。同时成为2一定是非常巧合的事情。下一步更多文章请访问:学习Linux订阅更新,获取更多学习资料,请关注我们的微信公众号: