Linux fd文件描述符的本来面目

文件描述符 【file descriptor】

对于内核而言、所有打开的文件都是通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个文件时、内核向用户进程返回一个文件描述符。当读或写一个文件时、使用open或crate返回的文件描述符标识该文件,将其作为参数传递给write或read.

在依从POSIX的应用程序中、幻数0、1、2应当替换成STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO.这些常量定义在头文件

说了这么多 文件描述符到底是什么呢?内核怎么通过文件描述符来操作文件的呢?这个问题困惑了我好久 直到我看Linux内核代码.才知道原来神秘的文件描述符是数组下标。

下面就来看看文件描述符的庐山真面目吧...

        如下图:

Linux fd文件描述符的本来面目_第1张图片

task_struct描述的就是当前运行的进程【进程控制块PCB】当前进程控制块中有一个属性是当前进程打开的文件表项 files_struct 而该结构体中又俩个字段 fd 以及fd_array、fd字段指向fd_array指针数组、该数组的长度存放在max_fds、而fd_array[NR_OPEN_DEFAULT] 这个宏如下:

Linux fd文件描述符的本来面目_第2张图片

fd_array[NR_OPEN_DEFAULT]的NR_OPEN_DEFAULT可能是32也可能是64跟具体的平台相关、

对于在fd数组中有入口地址的每个文件来说、数组的索引就是文件描述符、通常数组的第一个元素【索引为0】是进程的标准输入文件、数组的第二个元素【索引是1】是进程的标准输出、数组的第三个元素【索引是2】是进程的标准错误文件。

这样说显示也没有说服力 下面看一下内核代码 来证明文件描述符就是fd数组的下标。

以内核sys_read代码为例子:

Linux fd文件描述符的本来面目_第3张图片

感觉阅读Linux内核代码 对理解一些抽象的概念很有帮助!



你可能感兴趣的:(Linux)