2、文件描述符

下面进一步介绍进程对自己所访问的file对象的管理方法。linux中使用一个数组来管理进程打开的文件的file对象,数组中的每个元素都存放一个纸箱进程所打开的文件的file对象。既然用一个数组来存放file对象,那么用数组的下标来访问文件就是一件顺理成章的方法,于是,linux就把数组元素的下标叫做该数组元素所对应的文件的文件描述符,该描述符就是系统对文件的标识,这个数组也叫文件描述符数组,如下图所示:

内核通过系统调用dup、dup2和fctl可以使数组中的多个元素指向同一个文件的file对象,也就是说,在linux中,同一个文件可以有多个文件描述符。

3、进程打开文件表

进程描述符数组中存放了一个进程所访问的所有文件,把这个文件描述符数组和这个数组在系统中的一些动态信息组合到一起,就形成了一个新的数据结构——进程打开文件表,即file_struct,其定义如下:

/*

* Open file table structure

*/

struct files_struct {

atomic_t count;                               //引用计数

spinlock_t file_lock;     /* Protects all the below members.  Nests inside tsk->alloc_lock */

struct fdtable *fdt;                          //管理文件描述符

struct fdtable fdtab;                         //管理文件描述符

fd_set close_on_exec_init;                    //位图

fd_set open_fds_init;                         //位图

struct file * fd_array[NR_OPEN_DEFAULT];      //文件描述符数组

};

显然,这个结构应该属于进程的私有数据,所以进程控制块task_struct用指针files指向它。

struct task_struct {

...

/* open file information */

struct files_struct *files;

...

};

进程与其打开文件之间的关系如下图所示。

4、文件描述符的管理

file_struct中的fdt和fdtab用于管理文件文件描述符,一个是fdtable类型,另一个是其指针类型。fdtable的定义如下:

struct fdtable {

unsigned int max_fds;               //可以代开的最大文件数

int max_fdset;                      //位图的最大长度

int next_fd;                        //下一个可用的fd

struct file ** fd;      /* current fd array 指向files_struct的fd_array */

fd_set *close_on_exec;

fd_set *open_fds;                   //打开的文件标记,比如第2位为0,则打开了2号文件

struct rcu_head rcu;

struct files_struct *free_files;

struct fdtable *next;

};

下图可以很直观的说明文件描述符fd的管理。

22/2<12

简述linux内核中,Linux内核中的文件描述符(一)——基础知识简介相关推荐

  1. Linux中文件描述符1,linux内核中的文件描述符(一)--基础知识简介

    原标题:linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blo ...

  2. linux内核中的文件描述符(一)--基础知识简介

    linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.cs ...

  3. Linux 下的0 1 2特殊文件描述符~

    最近在做项目的时候遇到的几个知识点,我觉得非常有意思,以前学Linux的时候也有接触到管道方面的,但是在应用中却基本没有遇到过. 还有Linux下的几个特殊的文件描述符,用这几个文件描述符可以做很多事 ...

  4. 嵌入式Linux系统编程学习之九基于文件描述符的文件操作

    文章目录 前言 一.文件描述符 二.打开.创建和关闭文件 三.读写文件 四.改变文件大小 五.文件定位 六.原子操作 七.进一步理解文件描述符 八.文件描述符的复制 九.文件的锁定 十.获取文件信息 ...

  5. Linux操作系统~系统文件IO,什么是文件描述符fd?什么是vfs虚拟文件系统

    目录 1.open() (1).第二个参数flags-通过比特位传多组标记 2.文件描述符fd(open函数的返回值) (1).fd的本质 (2).vfs-虚拟文件系统(一切皆文件) (3).调用re ...

  6. linux文件描述符泄漏,文件描述符(fd)泄漏排查一篇就够了

    生产多次遇到文件描述符(fd)泄露相关的问题, 文件描述符泄漏一般引起 的现象是文件句柄数(封面图)/tcp alloc(上图)增长.文章分为两部分介绍文件描述符相关内容,第一部分介绍文件描述基础知识 ...

  7. Linux中的文件描述符与打开文件之间的关系

    1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是 ...

  8. Linux中进程间传递文件描述符的方法

    在进行fork调用后,由于子进程会拷贝父进程的资源,所以父进程中打开的文件描述符在子进程中仍然保持着打开,我们很容易的就将父进程的描述符传递给了子进程.但是除了这种情况下,如果想将某个父进程在子进程创 ...

  9. linux c中的文件描述符与打开文件之间的关系

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通 ...

  10. Linux文件,文件描述符以及dup()和dup2()

    一.Linux中文件 可以分为4种:普通文件.目录文件.链接文件和设备文件. 1.普通文件 是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据. ls -lh 来查 ...

最新文章

  1. sqlserver查询自定义的函数
  2. 安卓上的微软 Edge 浏览器新增支持长截图
  3. ios 获取沙盒文件名_iOS怎么获取并移除沙盒中Documents文件夹下的所有文件
  4. js获取当前浏览器地址栏的链接,然后在链接后面加参数
  5. 【Linux 操作系统】Ubuntu 配置 ftp freemind adb
  6. 一个可以显示具体时间的日历控件应用
  7. python写小说阅读器_用python实现自己的小说阅读器!
  8. mysql 5.7 redo replacation_mysql replace
  9. java 图像边界识别_图像识别原理之如何识别图像边缘
  10. ES8新特性_ES8中对象方法的扩展---JavaScript_ECMAScript_ES6-ES11新特性工作笔记052
  11. 剑指offer——5.替换空格
  12. 从零开始学ios开发(十三):Table Views(下)Grouped and Indexed Sections
  13. 编译原理算符分析器实现 -* c语言代码,编译原理论文-词法分析器的设计与实现...
  14. 用HTML写会员注册页面
  15. 训练集,验证集与测试集
  16. 在html中图片不显示不出来,网页图片显示不出来
  17. 神经元振荡中相位幅值耦合的量化:锁相值、平均向量长度、调制指数和广义线性模型交叉频率耦合
  18. 2021钳工技能高考成绩查询,这里有2021钳工时间和报名费用以及流程
  19. git 更新某个目录或文件
  20. 【OpenPCDet】稀疏卷积SPConv-v1.2代码解读(5)

热门文章

  1. 向iOS开发者介绍C++
  2. Spring框架教程集合
  3. 安装composer 提示需要反复重启解决办法
  4. 纯Javascript实现Windows 8 Metro风格实现
  5. html文件整体结构,HTML文件基本结构
  6. linux 从入参获取函数名字,C++ 函数名作为参数传递给另一个函数
  7. Vue组件学习之事件总线和消息发布订阅
  8. 系统性能指标、压测、性能优化思路
  9. Spring Boot application.yml文件语法
  10. Python机器学习:多项式回归001什么是多项式回归