(十八)VFS虚拟文件系统介绍、dup和dup2函数的介绍与使用


  Linux支持各种各样的文件系统格式,如ext2、ext3、reiserfs、FAT、NTFS、iso9660等等,不同的磁盘分区、光盘或其它存储设备都有不同的文件系统格式然而这些文件系统都可以mount到某个目录下,使我们看到一个统一的目录树,各种文件系统上的目录和文件我们用ls命令看起来是一样的,读写操作用起来也都是一样的,这是怎么做到的呢?Linux内核在各种不同的文件系统格式之上做了一个抽象层,使得文件、目录、读写访问等概念成为抽象层的概念,因此各种文件系统看起来用起来都一样,这个抽象层称为虚拟文件系统(VFS,Virtual Filesystem)。下图介绍了运行时文件系统在内核中的表示:
  这里写图片描述
  
  在linux中提供了dup和dup2两个函数用于复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的file结构体,可以有不同的File Status Flag和读写位置。请注意区分这两种情况。

#include <unistd.h>

int dup(int oldfd);
int dup2(int oldfd, int newfd);

  
使用举例:

#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int fd, save_fd;
    char msg[] = "This is a test\n";
    //打开一个somefile文件(以读写,创建方式打开)(设置权限位为:用户可读可写)
    fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
    if(fd<0) {
        perror("open");
        exit(1);
    }

    save_fd = dup(STDOUT_FILENO);//保存标准输出的文件描述符
    dup2(fd, STDOUT_FILENO);//复制somefile的文件描述符并占用标准输出位
    close(fd);

    //此时会将msg的内容输出到somefile文件中
    //使用printf效果也是输出到somefile文件中
    write(STDOUT_FILENO, msg, strlen(msg));

    dup2(save_fd, STDOUT_FILENO);//将文件描述符改回来
    write(STDOUT_FILENO, msg, strlen(msg));//输出到屏幕
    close(save_fd);
    return 0;
}

  
过程图解:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值