Linux打开文件的内核数据结构

上图表现了进程打开的标准输入与标准输出文件的内核数据结构(可用于所有I/O)。

值得注意的是:在Linux中没有使用v-node节点,而是直接使用了通用的i-node节点结构。

i-node节点包含了文件的类型、长度、所有者、访问权限以及指向文件实际数据在磁盘块上所在位置的指针等等。

stat结构中的大多数信息都取自i-node,只有两项重要数据存放在目录项中:文件名和i-node编号

如下图说明

 

首图中三张表(进程文件描述符表,打开文件表,i-node节点表)的关系及其表项内容也在图中表现出来了。

需要注意一点:这种表间关系对于在不同进程之间共享文件的方式非常重要。

如下图:两个独立进程各自打开同一个文件

注意打开文件表的表项中有一个文件状态标志和当前文件偏移量,各个进程对同一个文件可以持有不同的文件状态(如第一个进程指明非阻塞,而第二个进程默认阻塞)。另外,每个进程都有其自己的当前文件偏移量。

这也是为什么每个进程都获得自己的文件表项的原因。

另外,一个进程中多个文件描述符可能指向同一个文件表项,比如使用dup/dup2系统调用所得到的新文件描述符。如下图:

 

在fork()后也发生同样的情况,此时父子进程各自的每一个打开文件描述符共享同一个文件表项。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值