【Linux】虚拟文件系统

 🔥博客主页: 我要成为C++领域大神

🎥系列专栏【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】

❤️感谢大家点赞👍收藏⭐评论✍️

本博客致力于分享知识,欢迎大家共同学习和交流。

虚拟文件系统(Virtual File System, VFS)是操作系统内核的一部分,它提供了一个抽象层,使得不同文件系统能够统一接口进行操作。VFS使得应用程序可以以统一的方式访问不同类型的文件系统,如本地文件系统、网络文件系统等,而不需要关心底层文件系统的具体实现。

虚拟文件系统的作用

  1. 统一接口:VFS提供了一组标准化的文件操作接口,使得应用程序可以不关心底层文件系统的类型,直接进行文件操作。
  2. 文件系统抽象:VFS抽象出文件系统的细节,使得内核可以支持多种不同的文件系统,如ext4、NTFS、FAT32等。
  3. 文件系统挂载:VFS允许将不同的文件系统挂载到同一个目录树中,从而实现统一的命名空间。

如何实现统一接口

在3~4G的内核空间,有一个file结构体
file结构体
包含了读写指针位置,flagsf_opf_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写入到其它文件内dupdup2 是 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;
}

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值