一、 实验目的

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()

实验步骤:

  1. 熟悉文件系统命令:

  2. 熟悉系统调用函数open(),read(),write(),close():

  3. 熟悉C库函数fopen(), fread(), fwrite(), fclose():

  4. 画出备份文件的过程图:
    两种方法备份文件的方法都是一样的,所以下面这个流程图对这两个方法都适用:

六、 实验结果分析(截屏的实验结果,与实验结果对应的实验分析)

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对应的文件中读取size
nmemb个字节的数据存入缓冲区ptr中
③fwrite()函数可以往stream对应的文件中写入缓冲区ptr中前size*nmemb个字节的数据
④fclose()函数,可以关闭指定的流,释放资源

3、上述二者的区别在哪里?
答:从功能上看,上述二者并无差别,在代码实现上也非常地相似,但是在原理上,上述二者具有以下差别:
①open(),read(),write(),close()为系统调用函数,执行的时候必须从用户模式切换到内核模式,执行完毕后,再从内核模式切换到用户模式
②fopen(),fread(),fwrite(),fclose()为C库函数,只在用户态调用和执行
③系统调用函数因为需要在用户态和内核态之间来回切换,所以非常影响系统的性能,可以在一次系统调用中尽可能多地完成工作,以达到减少系统调用次数的目的,从而减少开销。后者比前者的效率要高很多。
④前者是系统函数,不可移植,在不同的操作系统上系统调用函数是不同的,而后者是标准C库函数,是可以移植的,所以在不同的操作系统上都是相同的。

操作系统实验报告(四)文件系统相关推荐

  1. 山东大学linux实验四CSDN,山东大学操作系统实验报告材料4进程同步实验

    <山东大学操作系统实验报告材料4进程同步实验>由会员分享,可在线阅读,更多相关<山东大学操作系统实验报告材料4进程同步实验(15页珍藏版)>请在人人文库网上搜索. 1.实用标准 ...

  2. 南京邮电大学c语言实验报告3v2,南京邮电大学操作系统实验报告

    <南京邮电大学操作系统实验报告>由会员分享,可在线阅读,更多相关<南京邮电大学操作系统实验报告(20页珍藏版)>请在人人文库网上搜索. 1.通信与信息工程学院2015 / 20 ...

  3. 操作系统实验报告16:CPU 调度

    操作系统实验报告16 实验内容 实验内容:CPU 调度. 讨论课件 Lecture19-20 中 CPU 调度算法的例子,尝试基于 POSIX API 设计一个简单调度器(不考虑资源竞争问题): 创建 ...

  4. 操作系统实验报告15:进程同步与互斥线程池

    操作系统实验报告15 实验内容 实验内容:进程同步. 内容1:编译运行课件 Lecture18 例程代码. Algorithms 18-1 ~ 18-9. 内容2:在 Lab Week 13 的基础上 ...

  5. 操作系统实验报告12:线程2

    操作系统实验报告12 实验内容 实验内容:线程(2). 编译运行课件 Lecture14 例程代码: Algorithms 14-1 ~ 14-7. 比较 pthread 和 clone() 线程实现 ...

  6. 操作系统实验报告10:线程1

    操作系统实验报告10 实验内容 实验内容:线程(1). 编译运行课件 Lecture13 例程代码: Algorithms 13-1 ~ 13-8 实验环境 架构:Intel x86_64 (虚拟机) ...

  7. 操作系统实验报告7:进程间通信—共享内存。实现一个带有n个单元的线性表的并发维护。

    操作系统实验报告7 实验内容 实验内容:进程间通信-共享内存.实现一个带有n个单元的线性表的并发维护. 建立一个足够大的共享内存空间(lock, M),逻辑值lock用来保证同一时间只有一个进程进入M ...

  8. 操作系统实验报告6:进程间通信—共享内存

    操作系统实验报告6 实验内容 实验内容:进程间通信-共享内存. (1).验证:编译运行课件 Lecture 08 例程代码: Linux 系统调用示例 reader-writer 问题:Algorit ...

  9. 操作系统实验报告4:Linux 下 x86 汇编语言3

    操作系统实验报告4 实验内容 验证实验 Blum's Book: Sample programs in Chapter 08, 10 (Basic Math Functions and Using S ...

  10. 操作系统实验报告3:Linux 下 x86 汇编语言2

    操作系统实验报告3 实验内容 验证实验 Blum's Book: Sample programs in Chapter 06, 07 (Controlling Flow and Using Numbe ...

最新文章

  1. 《java编程思想》学习笔记——内部类五
  2. 用命令行在控制台里玩斗地主,试过没?
  3. 网络推广公司网站该如何针对主页的优化工作?
  4. PAT乙级(1004 成绩排名)
  5. 机器学习基础(五十一)—— 决策树的剪枝
  6. mybatis #与$区别
  7. 蓝桥杯 大整数乘法 试题 算法训练 P0805
  8. Sicily 1049. Mondriaan 解题报告
  9. vs2005 安装sp1补丁问题汇总及安装解决方案,希望有大家有帮助
  10. python的多行注释以什么开头_Python的多行注释
  11. 101个浪漫的点子..哈哈有需要可以试试...中英对照~
  12. 大功率mos管怎么测量好坏,如何用万用表判断mos管的好坏?够全面!
  13. threejs 特效 自定义发光围栏,发光墙体,闪烁动画
  14. 计算机网络中型网吧规划设计,中小型网咖网络规划设计开题报告
  15. 怎样给CSDN博客添加微信二维码
  16. 【GlobalMapper精品教程】012:WGS84转2000地理坐标系与平面坐标系
  17. 微信HOOK协议(PC版)源码demo
  18. [SCI][计算机视觉][图像处理]一二三四区期刊(自用)
  19. 前沿技术文章:高可靠性SSD推动智能社会向前发展
  20. python控制多个屏幕_多设备控制 + 屏幕操作录制重放 实现完整多设备测试流程...

热门文章

  1. 甘肃教师学苑2020文章代码_【重磅通知】甘肃省电化教育中心 关于聘任教育信息化研究员的通知...
  2. 10分钟就能学会,Linux操作系统21个shell常用命令
  3. 算法——Java实现栈
  4. hasp运行不成功_HASP加密狗驱动程序没有安装成功如何解决
  5. 超详细window10系统快速搭建Linux镜像环境
  6. 软件测试员200题(练习)
  7. 浏览器处理 前台传递的+时出现问题
  8. 遗传算法python实例_Python遗传算法框架使用实例(一)使用Geatpy实现句子匹配
  9. mysql类型float_Mysql数据类型---FLOAT
  10. ngrok小米球实现访问本地项目