微信公众号:郑尔多斯
关注可了解更多的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~z的26个字符
我们看一下代码:
从代码中可以看出来,我们先打开了
b.txt,然后读取三个字符。然后再一次打开b.txt, 重新读取了3个字符。看一下结果:我们再来试一下:
执行之后
b.txt的内容如下:再看看一个
输出结果如下:
再看一个,如下:
运行结果如下:
从上面的四个结果中可以看出来,同一个进程多次打开相同的文件,那么在系统会在系统级的打开文件列表中维护多个记录(虽然是打开的是同一个文件),所以每个文件描述符的读写偏移量都是独立的。
喜欢本文的朋友们,欢迎长按下图关注订阅号郑尔多斯,更多精彩内容第一时间送达