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

微信公众号:郑尔多斯
关注可了解更多的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的内容如下:
三者的关系

再看看一个

三者的关系

输出结果如下:
三者的关系
再看一个,如下:

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值