Linux文件系统-3个重要数据结构及相互间的关系

来源:互联网 发布:2017淘宝双十一规则 编辑:程序博客网 时间:2024/04/27 07:24

在linux文件系统中,有三个重要的数据结构:用户文件描述符,文件表,索引节点表,他们的具体关系如下图所示:


open系统调用将返回文件描述符,作为后续读写等操作使用。每个open调用都导致在用户描述表和内核文件表中分配一个唯一表项。文件项的引用数只有系统调用dup或fork的会使其引用数大于1,内核的索引节点表中,对每个文件只有一个表项,即使对同一文件一个对应读权限打开的文件描述符另一个对应写权限打开的文件描述符。

管道允许在进程之间按先进先出的方式传送数据。管道可用于进程间通信。管道分为两种,无名管道和有名管道,其区别如下:
1)无名管道调用pipe创建,有名管道调用open创建;
2)只有相关进程,即发出pipe调用的进程的后代才能共享对无名管道的存取,而所有的进程都能按通常的文件许可权,存取有名管道。

3)无名管道是临时的,当所有进程都结束使用某个管道时,内核便收回它的索引节点,而有名管道在文件系统中永久的存在(可用unlink来清楚)。

进程与管道的接口和进程与文件的接口是一致的。不同的是,在实现上,内核将读写的偏移量放在索引节点中而不是文件表中。

创建无名管道函数pipe一次调用返回两个文件描述符,并且内核也会从文件表中找到两个空闲表项及一个内存inode索引节点,文件描述符和文件表一一对应,而两个文件表则对应同一个inode,执行一个文件表的权限为读,一个文件表的权限为写。inode的引用数设置为2。管道存储数据的缓冲区会由内核从内存中分配出一页大小的内存来作为管道实现数据的读与写。如下图所示:


具体的实现原理后面会用一个篇幅来详细分析,主要涉及其中的数据结构和相应的读写算法。

0 0