操作系统实验报告4-文件系统

实验四    文件系统

  • 实验目的
  1. 熟悉Linux文件系统的文件和目录结构,掌握Linux文件系统的基本特征;
  2. 模拟实现Linux文件系统的简单I/O流操作:备份文件。
  • 实验内容
  1. 浏览Linux系统根目录下的子目录,熟悉每个目录的文件和功能;
  2. 设计程序模拟实现Linux文件系统的简单I/O流操作:备份文件。
  • 实验原理
  1. Linux各种发行版的目录结构基本一致,各个目录简单介绍如下:
     

目录

描述

/

根目录

/bin

做为基础系统所需要的最基础的命令就是放在这里。比如 ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令。

/boot

Linux的内核及引导系统程序所需要的文件,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录;启动装载文件存放位置,如kernels,initrd,grub。一般是一个独立的分区。

/dev

一些必要的设备,声卡、磁盘等。还有如 /dev/null. /dev/console /dev/zero /dev/full 等。

/etc

系统的配置文件存放地. 一些服务器的配置文件也在这里;比如用户帐号及密码配置文件;

/etc/opt:/opt对应的配置文件

/etc/X11:Xwindows系统配置文件

/etc/xml:XML配置文件

……

/home

用户工作目录,和个人配置文件,如个人环境变量等,所有的账号分配一个工作目录。一般是一个独立的分区。

/lib

库文件存放地。bin和sbin需要的库文件。类似windows的DLL。

/media

可拆卸的媒介挂载点,如CD-ROMs、移动硬盘、U盘,系统默认会挂载到这里来。

/mnt

临时挂载文件系统。这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom 等目录。可以参看/etc/fstab的定义。

/opt

可选的应用程序包。

/proc

操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统,它的定义可以参见 /etc/fstab 。

/root

Root用户的工作目录

/sbin

和bin类似,是一些可执行文件,不过不是所有用户都需要的,一般是系统管理所需要使用得到的。

/tmp

系统的临时文件,一般系统重启不会被保存。

/usr

包含了系统用户工具和程序。

/usr/bin:非必须的普通用户可执行命令

/usr/include:标准头文件

 /usr/lib:/usr/bin/ 和 /usr/sbin/的库文件

 /usr/sbin:非必须的可执行文件

/usr/src:内核源码

/usr/X11R6:X Window System, Version 11, Release 6.

/srv

该目录存放一些服务启动之后需要提取的数据

  1. Linux的文件结构是单个的树状结构.可以用tree进行展示。文件操作命令见附录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 层和内核的其他部分看来,所有文件系统都是相同的。

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

  • 实验中用到的系统调用函数

         实验只是模拟实现文件的备份功能,不需要系统调用函数。

五、实验步骤

1、 对文件系统命令和库函数要提前熟悉;

2、 画出备份文件的过程图;

3、 测试数据文件提前准备好;

需要备份的文件:

4、 编写程序并调试;

#include<stdlib.h>

#include<stdio.h>

#include<string.h>

int main()

{

    FILE* fp1=NULL;

    FILE* fp2=NULL;

    char* ptr;

    fp1 = fopen("clz1.txt", "r");        //打开只读文件,该文件必须存在

    if (!fp1)                          //创建文件失败则退出

    {

         printf("打开文件失败\n");

         exit(1);

    }

    fp2 = fopen("clz2.txt", "w");      //打开只写文件用来备份,若文件存在,则长度清零,若不存在则建立该文件

    if (!fp2)                          //创建文件失败则退出

    {

         printf("打开文件失败\n");

         exit(1);

    }

    ptr = (char*)malloc(sizeof(char) * 1024);       //分配空间

    int nmemb = fread(ptr, sizeof(char), 1024, fp1);     //读取文件数据,返回实际读取到的nmemb数目

    fwrite(ptr, sizeof(char), nmemb, fp2);    //将数据写至备份文件

    fclose(fp1);                            //用来关闭之前打开的文件

    fclose(fp2);

   

}

5、 截屏输出实验结果;

运行:

成功备份文件:

clz1clz2文件内容相同

6、 根据实验结果与理论课讲述的原理进行实验分析。

        使用fopen()打开文件clz1.txt和clz2.txt,文件打开失败则会退出程序。因为clz1.txt是备份文件,需要提前创建好并写入内容,若clz2.txt没有创建好,则会在打开clz2.txt时创建文件,然后通过fread()读取备份文件clz1.txt中的数据,并通过fwrite()写入clz2.txt,备份成功后,使用fclose()关闭两个文件。

备份文件内容:

在计算机中,操作系统是其最基本也是最为重要的基础性系统软件。从计算机用户的角度来说,计算机操作系统体现为其提供的各项服务;从程序员的角度来说,其主要是指用户登录的界面或者接口

备份成功:

六、思考题

1、使用系统调用函数open(),read(),write(),close()实现简单文件备份的原理是什么?

  系统调用函数是通过文件描述符来实现文件的备份的

  1. open()创建一个新的文件描述符。open 建立了一条到文件或设备的访问路径。如果调用成功,它将返回一个可以被 read、write 和其他系统调用使用的文件描述符。
  2. read()把文件描述符相关联的文件传送count个字节到buf指针所指的内存中,然后返回实际读取到的字节数
  3. write()把buf所指的内存写入count个字节到与文件描述符关联的文件中,返回实际写入的字节数。
  4. close()可以用来终止文件描述符与其对应文件之间的关联。

2、使用C库函数fopen(), fread(), fwrite(), fclose() 来实现简单文件备份的原理是什么?

使用C库函数实现文件备份实际上是建立两个文件流,把其中一个流中的数据写入另一个流中。

  1. fopen()打开文件,在文件顺利打开后,指向该流的文件指针就会被返回,若文件打开失败则返回NULL;
  2. fread()用来从文件流读取数据,通过fopen返回的指针读取指定文件的数据,之后会返回实际读取到的nmemb数目
  3. fwrite()用来将数据写入文件流中,通过fopen返回的指针向指定的文件写入数据
  4. fclose()关闭先前fopen打开的文件,同时会让缓冲区的数据写入文件,释放系统所提供的文件资源

3、上述二者的区别在哪里?

1. 系统调用函数:在内核模式中运行,建立在文件描述符的基础上;

C库函数:在用户态下执行,建立在数据流的基础上。

2. 在所有的编译器版本中,C库函数是相同的,但各个操作系统的系统调用是不同的

3. 系统调用需要在切换到内核上下文环境再切换回来,开销比较大;而C库函数属于过程调用,开销比较小。

4. C库函数是调用函数库中的一个程序,而系统调用会调用系统内核的服务

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的】 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 打开文件名 打开保护码 读写指针

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值