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

内核何时为单个文件创建多个vnode条目及相关技术疑问

内核何时会决定为单个文件创建多个vnode条目?

我找到以下代码,并有几个后续问题:

#include <fcntl.h>

int main()
{
  // 让内核打开两个到文件alphabet.txt的连接,该文件包含从a到z的字母
  int fd1 = open("alphabet.txt",O_RDONLY);
  int fd2 = open("alphabet.txt",O_RDONLY);


  // 交替从fd1和fd2读取字符并写入标准输出
  while(1)
  {
    char c;
    if (read(fd1,&c,1) != 1) break;
    write(1,&c,1);
    if (read(fd2,&c,1) != 1) break;
    write(1,&c,1);
  }

  return 0;
}

后续问题

  1. 若在两个进程中独立打开同一目录下的同一个文件,会创建两个vnode条目吗?还是取决于操作系统?
// PID 1
  int fd1 = open("alphabet.txt",O_RDONLY);
  // PID 2
  int fd2 = open("alphabet.txt",O_RDONLY);
  1. read()如何知晓文件的位置?C语言是否会先获取fd1对应的vnode条目并返回其地址?
  2. 承接问题2,read()会创建新的vnode条目还是使用已有的同一个?

问题解答

  1. 不会创建两个vnode条目,绝大多数类Unix系统都是这个逻辑。vnode是内核用来标识物理文件的核心结构,同一个文件只会对应一个vnode,不管多少进程打开它。进程每次执行open时,会生成独立的文件描述符(fd)和文件表项,但这些文件表项都会指向同一个vnode。

  2. 文件的当前读取偏移量存在文件表项里,不是vnode中。调用read()时,内核会通过文件描述符找到对应的文件表项,从中拿到当前偏移量,完成读取操作后再更新这个偏移量。用户态的C程序接触不到vnode,更不会获取它的地址,这些都是内核空间的内部操作。

  3. read()不会创建新的vnode。只要文件还有被引用(比如有进程打开着它),内核就会保留这个vnode,所有针对该文件的操作都会复用同一个vnode。read()只负责操作对应的文件表项,和vnode的创建没有关系。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:16:20