文件描述符、文件指针以及文件表、文件描述符表概念总结

在Linux系统中,已打开的文件形成文件表(open file table),存放在内核空间中,并由系统里的所有进程共享。该表中每个表格保存了一个打开文件的全部信息,如下所示:

  1. 当前文件偏移量(调用read()和write()时更新,或使用lseek()直接修改);
  2. 打开文件时所使用的状态标识(即,open()的flags参数);
  3. 文件访问模式(如调用open()时所设置的只读模式、只写模式或读写模式);
  4. 与信号驱动相关的设置;
  5. 对该文件i-node对象的引用;
  6. 文件类型(例如:常规文件、套接字或FIFO)和访问权限;
  7. 一个指针,指向该文件所持有的锁列表;
  8. 文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳;

因此,将表格中存放这些条目的结构称为打开文件句柄(open file handle)(与C语言中的FILE结构类似,但并不是一个概念)

不同进程打开现存文件或新建文件时,内核会返回一个文件描述符(file descriptor),它是个非负整数。在所有进程的PCB(Process Control Block)中均会保存一份文件描述符表(可以理解为一个数组),文件描述符就是这个表的索引(数组下标),每个表项都有一个指向已打开文件的指针(数组的内容),具体是指向文件表中该文件对应的表格项。

文件描述符是一个POSIX标准下的概念,为系统调用接口,常见于Linux系统。Windows也是声称遵循POSIX标准的,所以Windows也有文件描述符等概念,但不常用。文件描述符的分配规则: 从当前未被分配的最小整数处分匹配,特别的有:标准输入(stdin)的文件描述符是 0;标准输出(stdout)的文件描述符是 1;标准错误(stderr)的文件描述符是 2。

易混淆的两个概念: 文件指针与文件句柄

C语言中使用文件指针(FILE *)做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构,而FILE结构体中包含文件描述符。文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄,是对文件描述符的一种封装。

文件句柄是Windows下各种对象的标识符,比如文档、资源、菜单、光标、位图等。文件句柄和文件描述符类似,它也是一个非负整数,也用于定位文件数据在内存中的位置。某种意义上,可以将Windows系统上的文件描述符称作文件句柄。

参考:
1.https://blog.csdn.net/cywosp/article/details/38965239
2.https://blog.csdn.net/dream_1996/article/details/71433972
4.https://blog.csdn.net/luotuo44/article/details/17474099

发布了37 篇原创文章 · 获赞 33 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/xu_fengyu/article/details/85253559
今日推荐