操作系统实验报告文件系统
Posted mp-ui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统实验报告文件系统相关的知识,希望对你有一定的参考价值。
一、 实验目的
1、 熟悉Linux文件系统的文件和目录结构,掌握Linux文件系统的基本特征;
2、 模拟实现Linux文件系统的简单I/O流操作:备份文件。
二、 实验环境
Ubuntu 20.10、gcc编译器
三、 实验内容
1、 浏览Linux系统根目录下的子目录,熟悉每个目录的文件和功能;
2、 设计程序模拟实现Linux文件系统的简单I/O流操作:备份文件。
四、 实验要求
1、 对文件系统命令和库函数要提前熟悉;
2、 画出备份文件的过程图;
3、 测试数据文件提前准备好;
4、 编写程序并调试;
5、 截屏输出实验结果;
6、 根据实验结果与理论课讲述的原理进行实验分析。
五、 实验原理 实验中用到的系统调用函数(包括实验原理中介绍的和自己采用的),实验步骤
实验原理:
1、 Linux各种发行版的目录结构基本一致,各个目录简单介绍如下:
2、 Linux的文件结构是单个的树状结构.可以用tree进行展示。文件操作命令见附录1,
3、 Linux文件系统:Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文件 I/O 系统 调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,对文件的 操作可以跨文件系统而执行。“一切皆是文件”是 Unix/Linux 的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、 套接字等在 Unix/Linux 中都是以文件被对待;它们虽然类型不同,但是对其提供的却是同一套操作界面。
4、 虚拟文件系统(Virtual File System, 简称 VFS), 是 Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口;同时,它也提供了内核中的一个 抽象功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖 VFS 共存,而且也依靠 VFS 协同工作。为了能够支持各种实际文件系统,VFS 定义了所有文件系统都支持的基本的、概念上的接口和数据 结构;同时实际文件系统也提供 VFS 所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式 上与VFS的定义保持一致。换句话说,一个实际的文件系统想要被 Linux 支持,就必须提供一个符合VFS标准 的接口,才能与 VFS 协同工作。实际文件系统在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS 层和内核的其他部分看来,所有文件系统都是相同的。
5、利用C库函数fopen(), fread(), fwrite(), fclose() 来实现简单的文件备份, 即将一个文件的内容拷贝到另一个文件中去。
实验中用到的系统调用函数:
open(),read(),write(),close()
实验步骤:
-
熟悉文件系统命令:
-
熟悉系统调用函数open(),read(),write(),close():
-
熟悉C库函数fopen(), fread(), fwrite(), fclose():
-
画出备份文件的过程图:
两种方法备份文件的方法都是一样的,所以下面这个流程图对这两个方法都适用:
六、 实验结果分析(截屏的实验结果,与实验结果对应的实验分析)
1、实验结果与实验程序、实验步骤、实验原理、操作系统原理的对应分析;
2、不同条件下的实验结果反应的问题及原因;
3、实验结果的算法时间、效率、鲁棒性等性能分析。
浏览Linux系统根目录下的子目录,熟悉每个目录的文件和功能:
根目录下的所有文件:
/bin:
/boot:
/dev:
/etc:
/home:
/lib:
/media:
/mnt:
/opt:
/proc:
/root:
(无法访问)
/sbin:
/tmp:
/usr:
/srv:
(文件夹为空)
设计程序模拟实现Linux文件系统的简单I/O流操作:备份文件:
备份的文件存放在目录"/home/prince/file.txt"中,文件内容如图所示:
(不放图了,因为是在新华网随便复制的一篇文章,放图上来竟然能被识别到)
分别使用系统调用函数和C库函数对这个文件进行备份,备份文件名分别为backup1.txt和backup2.txt,运行程序,结果如图所示:
打开文件backup1.txt和backup2.txt,对比里面的内容:
(也不放图了,理由同上)
七、 实验数据及源代码(学生必须提交自己设计的程序源代码,并有注释,源代码电子版也一并提交),包括思考题的程序。
程序源代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
const char* source = "/home/prince/file.txt"; //需要备份的源文件路径
//使用系统调用函数open(),read(),write(),close()
void backup1(){
int src,dest,size;
char str[128];
src = open(source,O_RDONLY);
dest = open("/home/prince/backup1.txt", O_WRONLY | O_CREAT); //写文件,如果文件不存在则创建
if(src == -1){
printf("src文件打开失败\\n");
return;
}
if(dest == -1){
printf("dest文件打开失败\\n");
close(src);
return;
}
while((size = read(src,str,sizeof(str)))){
write(dest,str,size);
}
close(src);
close(dest);
printf("源文件file.txt已经成功备份,备份文件为backup1.txt\\n");
}
//使用c库函数fopen(),fread(),fwrite(),fclose()
void backup2(){
char str[128];
FILE *src, *dest;
int size;
src = fopen(source,"r");//读取源文件
dest = fopen("/home/prince/backup2.txt","w");
if(!src){
printf("src 打开文件失败!\\n");
return;
}
if(!dest){
printf("dest 打开文件失败!\\n");
fclose(src);
return;
}
//循环读取内容,直到读取到文件结尾
while((size = fread(str,sizeof(char),128,src))){
//printf("%d %s\\n",size, str);
fwrite(str,sizeof(char),size,dest);
}
fclose(src);
fclose(dest);
printf("源文件file.txt已经成功备份,备份文件为backup2.txt\\n");
}
int main(){
backup1();
backup2();
return 0;
}
八、思考题:
1、使用系统调用函数open(),read(),write(),close()实现简单文件备份的原理是什么?
答:
①系统调用open()函数,指定一个文件路径,则会返回一个大于0的文件描述词,如果返回值为-1代表打开文件失败。这个文件描述词可以被read()/write()和其他的系统调用函数使用。
②使用read()函数,可以向文件描述词fd对应的文件中读取size个字节的数据,并将数据存入缓冲区ptr中
③使用write()函数,可以将缓冲区ptr里前size个字节的数据写入文件描述词fd对应的文件中
④使用close()函数,可以关闭该文件,释放资源
2、使用C库函数fopen(), fread(), fwrite(), fclose() 来实现简单文件备份的原理是什么?
答:
①C库函数fopen(),可以根据指定的文件路径,读取文件,并把文件保存在FILE中
②fread()函数可以在stream对应的文件中读取sizenmemb个字节的数据存入缓冲区ptr中
③fwrite()函数可以往stream对应的文件中写入缓冲区ptr中前size*nmemb个字节的数据
④fclose()函数,可以关闭指定的流,释放资源
3、上述二者的区别在哪里?
答:从功能上看,上述二者并无差别,在代码实现上也非常地相似,但是在原理上,上述二者具有以下差别:
①open(),read(),write(),close()为系统调用函数,执行的时候必须从用户模式切换到内核模式,执行完毕后,再从内核模式切换到用户模式
②fopen(),fread(),fwrite(),fclose()为C库函数,只在用户态调用和执行
③系统调用函数因为需要在用户态和内核态之间来回切换,所以非常影响系统的性能,可以在一次系统调用中尽可能多地完成工作,以达到减少系统调用次数的目的,从而减少开销。后者比前者的效率要高很多。
④前者是系统函数,不可移植,在不同的操作系统上系统调用函数是不同的,而后者是标准C库函数,是可以移植的,所以在不同的操作系统上都是相同的。
以上是关于操作系统实验报告文件系统的主要内容,如果未能解决你的问题,请参考以下文章