文件系统-操作系统实验

实验: 文件系统

一、实验目的
1、熟悉Linux文件系统的文件和目录结构,掌握Linux文件系统的基本特征;
2、模拟实现Linux文件系统的简单I/O流操作:备份文件。
二、实验内容
1、浏览Linux系统根目录下的子目录,熟悉每个目录的文件和功能;
2、设计程序模拟实现Linux文件系统的简单I/O流操作:备份文件。
三、实验原理
1、Linux各种发行版的目录结构基本一致,各个目录简单介绍如下:
在这里插入图片描述
在这里插入图片描述
2、Linux文件系统:Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文件 I/O 系统 调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,对文件的 操作可以跨文件系统而执行。“一切皆是文件”是 Unix/Linux 的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、 套接字等在 Unix/Linux 中都是以文件被对待;它们虽然类型不同,但是对其提供的却是同一套操作界面。

3、虚拟文件系统(Virtual File System, 简称 VFS), 是 Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口;同时,它也提供了内核中的一个 抽象功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖 VFS 共存,而且也依靠 VFS 协同工作。为了能够支持各种实际文件系统,VFS 定义了所有文件系统都支持的基本的、概念上的接口和数据 结构;同时实际文件系统也提供 VFS 所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式 上与VFS的定义保持一致。换句话说,一个实际的文件系统想要被 Linux 支持,就必须提供一个符合VFS标准 的接口,才能与 VFS 协同工作。实际文件系统在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS 层和内核的其他部分看来,所有文件系统都是相同的。

4、利用C库函数fopen(), fread(), fwrite(), fclose() 来实现简单的文件备份, 即将一个文件的内容拷贝到另一个文件中去。

四、实验中用到的系统调用函数
实验只是模拟实现文件的备份功能,不需要系统调用函数。
五、实验要求
1、 对文件系统命令和库函数要提前熟悉;
2、 画出备份文件的过程图;
在这里插入图片描述
3、 测试数据文件提前准备好;
文件jianjieshuaige.dat
在这里插入图片描述
4、 编写程序并调试;

#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>

int main()
{
        char buf;
        FILE *source, *backup;
        if ((source = fopen("./jianjieshuaige.dat", "r"))==NULL)
        {
                printf("Error in opening file.\n");
                exit(1);
        }
        if ((backup = fopen("./jianjieniubi.dat", "w"))==NULL)
        {
                printf("Error in creating file.\n");
                exit(1);
        }
        while (fread(&buf, sizeof(buf), 1, source) == 1)
        {
                if (!fwrite(&buf, sizeof(buf), 1, backup))
                {
                        printf("Error in writing file.\n");
                        exit(1);
                }
        }
        if (ferror(source) != 0)
        {
                printf("Error in reading file.\n");
                exit(1);
        }
        else
        {
                printf("success in reading file.\n");
        }
        if (fclose(source))
        {
                printf("Error in close file.\n");
                exit(1);
        }
        else
        {
                printf("success in reading file.\n");
        }
        
        if (fclose(backup))
        {
                printf("Error in close file.\n");
                exit(1);
        }
        else
        {
                printf("success in close file.\n");
                exit(1);
        }
}

5、 截屏输出实验结果;
结果:
执行程序前:
建立文件jianjieshuaige.dat,并且写入jianjie:shuaige
在这里插入图片描述
执行程序后:
在这里插入图片描述
增加了一个文件jianjieniubi.dat
在这里插入图片描述
6、 根据实验结果与理论课讲述的原理进行实验分析。
实验中,通过建立两个数据流,分别进行读取和写入的操作,实现了文件备份。
六、思考题
1、使用系统调用函数open(),read(),write(),close()实现简单文件备份的原理是什么?
系统调用函数open(),read(),write(),close()是通过文件描述符来实现文件的备份,文件描述符就是一些数值,用来描述文件的配置情况,通过文件描述符的管理,open建立了一条到文件或设备的访问路径,如果调用成功,返回一个可以被read、write等其他系统调用的函数使用的文件描述符。write的作用是把缓冲区buf的前nbytes个字节写入到文件描述符关联的文件中,返回实际写入的字节数。read系统调用的作用是从与文件描述符相关的文件里读入nbytes个字节的数据,并把它们放到数据区buf中,返回读入的字节数。close函数的作用是关闭文件描述符和其对应的文件之间的关联。

2、使用C库函数fopen(), fread(), fwrite(), fclose() 来实现简单文件备份的原理是什么?
在linux系统中,文件和设备都被看做事数据流,进行操作之前,必须先将流打开,可以通过调用库函数fopen()打开一个流,库函数fopen()的返回值为一个FILE结构指针,此结构中包含对所打开的流进行操作所需的全部信息。当流操作完成后,需要执行清空缓冲区,保存数据等操作,所以这个时候需要将流关闭,调用函数fclose()来完成。在实现文件备份的过程中,实际上是建立了两个流,把其中一个流中的数据写入另一个流中从而实现备份。

3、上述二者的区别在哪里?
在这里插入图片描述
系统调用open()等函数和C库函数fopen()等函数都是对文件的操作的相关函数,但前者是在内核模式中运行的,且是在文件描述符的基础上进行,而后者则是在用户模式下运行的,且是在数据流的基础上进行,而每一个文件流都对应一个底层的文件描述符。在进行C库函数fopen()等函数的调用时,相应的操作会在进入内核中以相应系统调用函数实现。

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实验目的】 1. 了解文件系统原理; 2. 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 【实验准备】 1.文件的逻辑结构  顺序文件  索引文件  索引顺序文件  直接文件和哈希文件 2.外存分配方式  连续分配  链接分配  索引分配 【实验内容】 1. 实验要求 要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 2. 实验题目  设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。  程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。  为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 因系统小,文件目录的检索使用了简单的线性搜索。文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。程序使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD)打开文件目录( AFD)(即运行文件目录)。 M D F 用户名 文件目录指针 用户名 文件目录指针 U F D 文件名 保护码 文件长度 文件名 A F D 打开文件名 打开保护码 读写指针

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值