linux文件描述符-学不会找我

461 阅读3分钟

微信公众号:郑尔多斯
关注可了解更多的Nginx知识。任何问题或建议,请公众号留言;
关注公众号,有趣有内涵的文章第一时间送达!
请关注个人博客, 戳这里

首先了解一下linux中文件描述符和打开的文件列表中间的关系。
在linux中,有三种数据结构,分别如下:
1、每个进程都有一个打开的文件描述符表(the per-process open file descriptor table)。
2、linux系统有一个系统级别的打开文件表(the system-wide table of open file descriptions)。
3、linux的文件系统有一个i-node表(the file system i-node table)。

linux为每一个进程保存一个open file descriptor table,该table中的每条记录都保存了相关联的文件描述符的信息,比如:
① 文件描述符的标识,当前仅有一个,即 close-on-exec
② 保存了一个指向系统级别的 open file description table的指针。

linux操作系统维护了一个system-wide table of open file descriptions,该表的每条记录包含如下信息:
① 当前文件的偏移量。也就是说,如果两个文件描述符指向了相同的打开文件表,那么他们共享相同的读写偏移量。
open文件时使用的标识
open文件时指定的访问权限
④ 信号相关的结构
⑤ 保存了一个指向i-node的指针

至于最后一个i-node表,它也是全局唯一的。它保存了文件的类型,文件的权限,文件锁等信息。(参考《linux/Unix系统编程手册》第5.4节)

下图是三者之间的关系。

三者的关系
三者的关系

但是上图缺少了一部分,即:如果同一个进程对同一个文件进行多次open操作,那么得到的这些文件描述符的关系是什么呢?
其实在《Linux/Unix系统编程手册》的5.4节中讲解上图的时候已经说明了情况,但是只用了一句话就带过了,我们今天用代码研究一下实际的情况。

首先查看b.txt的内容:从a~z26个字符

三者的关系
三者的关系

我们看一下代码:

三者的关系
三者的关系

从代码中可以看出来,我们先打开了b.txt,然后读取三个字符。然后再一次打开b.txt, 重新读取了3个字符。看一下结果:
三者的关系
三者的关系

我们再来试一下:

三者的关系
三者的关系

执行之后 b.txt的内容如下:
三者的关系
三者的关系

再看看一个

三者的关系
三者的关系

输出结果如下:

三者的关系
三者的关系

再看一个,如下:

三者的关系
三者的关系

运行结果如下:
三者的关系
三者的关系

从上面的四个结果中可以看出来,同一个进程多次打开相同的文件,那么在系统会在系统级的打开文件列表中维护多个记录(虽然是打开的是同一个文件),所以每个文件描述符的读写偏移量都是独立的。

三者的关系
三者的关系

喜欢本文的朋友们,欢迎长按下图关注订阅号郑尔多斯,更多精彩内容第一时间送达

郑尔多斯
郑尔多斯