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