🔥博客主页: 我要成为C++领域大神
🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️感谢大家点赞👍收藏⭐评论✍️
本博客致力于分享知识,欢迎大家共同学习和交流。
虚拟文件系统(Virtual File System, VFS)是操作系统内核的一部分,它提供了一个抽象层,使得不同文件系统能够统一接口进行操作。VFS使得应用程序可以以统一的方式访问不同类型的文件系统,如本地文件系统、网络文件系统等,而不需要关心底层文件系统的具体实现。
虚拟文件系统的作用
- 统一接口:VFS提供了一组标准化的文件操作接口,使得应用程序可以不关心底层文件系统的类型,直接进行文件操作。
- 文件系统抽象:VFS抽象出文件系统的细节,使得内核可以支持多种不同的文件系统,如ext4、NTFS、FAT32等。
- 文件系统挂载:VFS允许将不同的文件系统挂载到同一个目录树中,从而实现统一的命名空间。
如何实现统一接口
在3~4G的内核空间,有一个file结构体
file结构体包含了读写指针位置,flags,f_op,f_dentry,引用计数
f_op指向是驱动层的file_operations结构体,用来改变文件内容的函数都在这个结构体内。
f_dentry指向的是文件系统驱动inode_operations结构体,用来改变文件属性的函数都在这个结构体内
对于不同的文件系统来说,指针指向的结构体函数代码不同,以此来实现同一接口
文件描述符指向同一个文件
例如:文件描述符3指向了a.txt,文件描述符4也指向了a.txt。
当我们操作文件描述符3写入hello,操作写入了world,那么a.txt的内容是什么?
答:是hello world。因为两个文件描述符操作同一个文件,file结构体里的读写指针位置还停留在上一次操作的位置,所以会接着写入
例如:如果两个进程,分别有文件描述符指向了a.txt。
两个进程操作文件描述符,进程1写入hello,进程2写入了world,那么a.txt的内容是什么?
答:是world。两个进程分别分配一个file结构体,两个进程操作时,读写指针位置都在文件头。world就覆盖掉了hello
printf写入到文件中
printf是往STDOUT_FILENO中写字符串,而STDOUT_FILENO是标准输出文件描述符,修改它的指向就可以使用printf写入到其它文件内dup
和 dup2
是 Unix 系统调用,用于复制文件描述符。这两个函数有不同的使用场景和参数,下面详细介绍它们的功能、用法和区别。
dup
dup
函数用于复制一个文件描述符,并返回一个新的文件描述符,该新的文件描述符指向与原文件描述符相同的文件表项。
函数原型
#include <unistd.h>
int dup(int oldfd);
dup2
dup2
函数用于复制文件描述符,指定新文件描述符的数值。如果新文件描述符已经打开,dup2
会先将其关闭。
函数原型
#include <unistd.h>
int dup2(int oldfd, int newfd);
参数
oldfd
: 要复制的文件描述符。newfd
: 指定的新文件描述符。
使用dup和dup2修改printf打印的位置
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
umask(0000);
//创建保存日志的文件描述符
int fd_a=open("a.log",O_CREAT |O_WRONLY,0777 );
//保存标准输出文件描述符
int fd_save=dup(STDOUT_FILENO);
//修改标准输出文件的文件描述符
dup2(fd_a,STDOUT_FILENO);
printf("This is a test.\n");
//关闭文件
close(fd_a);
close(fd_save);
return 0;
}