内核何时为单个文件创建多个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; }
后续问题
- 若在两个进程中独立打开同一目录下的同一个文件,会创建两个vnode条目吗?还是取决于操作系统?
// PID 1 int fd1 = open("alphabet.txt",O_RDONLY); // PID 2 int fd2 = open("alphabet.txt",O_RDONLY);
- read()如何知晓文件的位置?C语言是否会先获取fd1对应的vnode条目并返回其地址?
- 承接问题2,read()会创建新的vnode条目还是使用已有的同一个?
问题解答
不会创建两个vnode条目,绝大多数类Unix系统都是这个逻辑。vnode是内核用来标识物理文件的核心结构,同一个文件只会对应一个vnode,不管多少进程打开它。进程每次执行
open时,会生成独立的文件描述符(fd)和文件表项,但这些文件表项都会指向同一个vnode。文件的当前读取偏移量存在文件表项里,不是vnode中。调用
read()时,内核会通过文件描述符找到对应的文件表项,从中拿到当前偏移量,完成读取操作后再更新这个偏移量。用户态的C程序接触不到vnode,更不会获取它的地址,这些都是内核空间的内部操作。read()不会创建新的vnode。只要文件还有被引用(比如有进程打开着它),内核就会保留这个vnode,所有针对该文件的操作都会复用同一个vnode。read()只负责操作对应的文件表项,和vnode的创建没有关系。
内容的提问来源于stack exchange,提问作者frank880610
相关产品推荐
相关产品推荐

