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

本文深入解析Linux内核中文件描述符的工作原理,解释其如何通过数组下标实现对文件的操作,并通过内核代码实例验证这一概念。了解如何在依从POSIX的应用程序中使用文件描述符,以及它们在进程控制块中的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件描述符 【file descriptor】

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

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

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

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

        如下图:

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


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

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

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

以内核sys_read代码为例子:


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值