You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不同进程以不同模式打开同一文件的内核打开文件表疑问

关于Linux文件描述符、打开文件表与inode的澄清

你的理解偏差在于对打开文件描述条目的作用认知,先明确几个核心点:

  1. 独立打开调用=独立打开文件条目
    不管是不同进程,还是同一进程多次调用open()打开同一文件(哪怕用相同模式),内核都会为每个open()生成独立的打开文件描述条目。你看到的Medium文章说法完全正确——进程A的fd5和进程B的fd10指向不同的打开文件条目,但共享同一个inode。

  2. 打开文件条目存的是「打开实例私有状态」
    打开文件描述条目里保存的是这个文件打开实例独有的数据,核心包括:

    • 专属的读写偏移量:这就是你疑问的关键——每个打开实例的偏移量是独立的,进程A的读写操作只会改变自己fd对应的偏移量,完全不影响进程B的fd偏移。
    • 打开模式(O_RDONLY/O_WRONLY/O_RDWR等)
    • 文件状态标志(O_APPEND/O_NONBLOCK等)
    • 该条目的引用计数(比如用dup()复制的文件描述符会共享同一个条目,此时引用计数+1)
  3. inode是文件的全局元数据载体
    inode存储的是文件本身的全局信息:权限、所有者、文件大小、磁盘块指针等。所有打开同一文件的实例都会指向同一个inode,所以对文件元数据的修改(比如chmod、truncate)会影响所有打开该文件的进程,但每个进程的打开实例私有状态(偏移、模式)互不干扰。

举个实际场景验证:

  • 进程A以读模式打开abc.txt,得到fd5,读取100字节后,fd5的偏移量变为100。
  • 进程B以写模式打开同一个abc.txt,得到fd10,写入50字节后,fd10的偏移量变为50。
  • 此时进程A继续读,会从自己的偏移量100开始读取文件内容,进程B继续写则从自己的偏移量50开始,两者的操作完全不会互相干扰偏移位置。

内容的提问来源于stack exchange,提问作者RootPhoenix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:16:12