linux 打开文件表 文件描述符,Linux 下文件描述符和打开文件之间的关系

2014-07-06 wcdj

文件描述符和打开的文件之间似乎是一一对应的关系,但实际可以多个文件描述符指向同一打开文件,这些文件描述符可能在相同或不同的进程中打开。内核维护的三个数据结构:

(1) 进程级的文件描述符表

(2) 系统级的打开文件表

(3) 文件系统的i-node表

1 进程级的文件描述符表

针对每个进程,内核为其维护打开文件的描述符表,该表的每一条目都记录了单个文件描述符的相关信息:

(a) 控制文件描述符操作的一组标志

(b) 对打开文件句柄的引用

2 系统级的打开文件表

内核对所有打开的文件维护有一个系统级的描述表(也称为,打开文件表),并将表中各条目称为打开文件句柄。一个打开文件句柄存储了与一个打开文件相关的全部信息:

(a) 当前文件偏移量(调用read()和write()时更新,或使用lseek()直接修改)

(b) 打开文件时所使用的状态标志(即,open()的flags参数)

(c) 文件的访问模式(如调用open()时所设置的只读模式、只写模式、或读写模式)

(d) 与信号驱动I/O相关的设置

(e) 对该文件i-node对象的引用

3 文件系统的i-node表

每个文件系统都会为驻留其上的所有文件建立一个i-node表,包含如下信息:

(a) 文件类型(例如,常规文件、套接字、或FIFO)和访问权限

(b) 一个指针,指向该文件所持有的锁的列表

(c) 文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳

下图展示了文件描述符表、打开的文件句柄,以及i-node之间的关系

0818b9ca8b590ca3270a3433284dd417.png

一些结论:

(1) 两个不同的文件描述符,若指向同一打开的文件句柄,将共享同一文件偏移量。因此,如果通过其中一个文件描述符来修改文件偏移量(由read()、write()或lseek()所致),那么从另一个文件描述符中也会观察到这一变化。无论这两个文件描述符分属于不同进程,还是同属于一个进程,情况都是如此。

(2) 要获取和修改打开的文件标志(例如,O_APPEND、O_NONBLOCK、O_ASYNC),可执行fcntl()的F_GETFL和F_SETFL操作。

(3) 文件描述符标志(即,close-on-exec)为进程和描述符所私有,对这一标志的修改不会影响同一进程或不同进程中其他文件描述符。

参考

[1] TLPI 5.4

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值