微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > linux内核中的文件描述符(一)--基础知识简介

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

时间:11-22 来源:互联网 点击:

所打开的文件的file对象。既然用一个数组来存放file对象,那么用数组的下标来访问文件就是一件顺理成章的方法,于是,linux就把数组元素的下标叫做该数组元素所对应的文件的文件描述符,该描述符就是系统对文件的标识,这个数组也叫文件描述符数组,如下图所示:

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

3.进程打开文件表

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

[plain]view plaincopyprint?

  1. /*
  2. *Openfiletablestructure
  3. */
  4. structfiles_struct{
  5. atomic_tcount;//引用计数
  6. spinlock_tfile_lock;/*Protectsallthebelowmembers.Nestsinsidetsk->alloc_lock*/
  7. structfdtable*fdt;//管理文件描述符
  8. structfdtablefdtab;//管理文件描述符
  9. fd_setclose_on_exec_init;//位图
  10. fd_setopen_fds_init;//位图
  11. structfile*fd_array[NR_OPEN_DEFAULT];//文件描述符数组
  12. };

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

[plain]view plaincopyprint?

  1. structtask_struct{
  2. ...
  3. /*openfileinformation*/
  4. structfiles_struct*files;
  5. ...
  6. };

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

4.文件描述符的管理

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

[plain]view plaincopyprint?

  1. structfdtable{
  2. unsignedintmax_fds;//可以代开的最大文件数
  3. intmax_fdset;//位图的最大长度
  4. intnext_fd;//下一个可用的fd
  5. structfile**fd;/*currentfdarray指向files_struct的fd_array*/
  6. fd_set*close_on_exec;
  7. fd_set*open_fds;//打开的文件标记,比如第2位为0,则打开了2号文件
  8. structrcu_headrcu;
  9. structfiles_struct*free_files;
  10. structfdtable*next;
  11. };

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


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top