文件系统-操作系统实验

实验: 文件系统

一、实验目的
1、熟悉Linux文件系统的文件和目录结构,掌握Linux文件系统的基本特征;
2、模拟实现Linux文件系统的简单I/O流操作:备份文件。
二、实验内容
1、浏览Linux系统根目录下的子目录,熟悉每个目录的文件和功能;
2、设计程序模拟实现Linux文件系统的简单I/O流操作:备份文件。
三、实验原理
1、Linux各种发行版的目录结构基本一致,各个目录简单介绍如下:
文件系统-操作系统实验_第1张图片
在这里插入图片描述
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、 画出备份文件的过程图;
文件系统-操作系统实验_第2张图片
3、 测试数据文件提前准备好;
文件jianjieshuaige.dat
文件系统-操作系统实验_第3张图片
4、 编写程序并调试;

#include
#include
#include

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
文件系统-操作系统实验_第4张图片
执行程序后:
在这里插入图片描述
增加了一个文件jianjieniubi.dat
文件系统-操作系统实验_第5张图片
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、上述二者的区别在哪里?
文件系统-操作系统实验_第6张图片
系统调用open()等函数和C库函数fopen()等函数都是对文件的操作的相关函数,但前者是在内核模式中运行的,且是在文件描述符的基础上进行,而后者则是在用户模式下运行的,且是在数据流的基础上进行,而每一个文件流都对应一个底层的文件描述符。在进行C库函数fopen()等函数的调用时,相应的操作会在进入内核中以相应系统调用函数实现。

你可能感兴趣的:(文件系统-操作系统实验)