操作系统 文件系统

简介: 操作系统 文件系统

实验四 文件系统

一、实验目的

1、熟悉Linux文件系统的文件和目录结构,掌握Linux文件系统的基本特征;

2、模拟实现Linux文件系统的简单I/O流操作:备份文件。

二、实验内容

1、浏览Linux系统根目录下的子目录,熟悉每个目录的文件和功能;

2、设计程序模拟实现Linux文件系统的简单I/O流操作:备份文件。

思考题:

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

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

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

三、实验原理

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 该目录存放一些服务启动之后需要提取的数据

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() 来实现简单的文件备份, 即将一个文件的内容拷贝到另一个文件中去。

四、实验中用到的系统调用函数

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

五、实验步骤

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

常见的文件系统命令有:

df:检查Linux服务器的文件系统的磁盘空间占用情况。

mount:用于挂载Linux系统外的文件。

du:查看某个文件或目录所占用磁盘空间的大小

ls:列出目录下的文件。

cd:切换目录。

pwd:显示当前工作目录。

mkdir:创建目录。

rm:删除文件或目录。

cp:主要用于复制文件或目录。

touch:刷新已存在的文件的访问时间或创建一个不存在的文件。

mv:移动文件。

ln:创建文件链接。

stat:主要用于显示文件或文件系统的详细信息

cat:用于连接文件并打印到标准输出设备上。

文件系统库函数:

fopen:打开文件

函数原型:FILE * fopen(const char *path,const char *mode)

函数参数说明:

path:文件名,包含路径,缺省为当前路径。

mode:r,rb:以只读方式打开文件。

w,wb:只写方式打开文件,如果文件不存在,则创建该文件。

a,ab:追加方式打开文件,如果文件不存在,则创建该文件。

r+,r+b,rb+:读写方式打开文件。

w+,w+b,wb+:读写方式打开,如果文件不存在,则创建该文件。

a+,a+b,ab+:读和追加方式打开文件,如果文件不存在,则创建该文件。

函数返回值:

成功:返回指向该流的文件指针。

失败:返回NULL,并将错误代码存放在errno中。

fclose:关闭之前打开的文件

函数原型:int fclose( FILE * stream)

函数参数说明:

stream:成功打开文件返回的FILE类型指针。

函数返回值:

若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno

fread:从文件流中读取数据

函数原型: size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);

函数参数说明:

ptr:指向欲存放读取进来的数据空间;

size:读取的块个数,跟nmemb配合使用

nmemb:读取的字符数;

stream:已打开的文件指针。

函数返回值:

成功:返回已读取的字节数/时间写入字段数;

失败:返回0,并将错误代码存在erron中。

fwrite:写文件

函数原型:size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream)

函数参数说明:

ptr:指向欲写入的数据地址;

size:每个字段的长度;

nmemb:写入的字符数;

stream:已打开的文件指针。

函数返回值:

成功:返回已读取的字节数/时间写入字段数;

失败:返回0,并将错误代码存在erron中。

fgetc:从指定的文件中读一个字符

函数原型:int fgetc(FILE *stream)

函数参数说明:stream:已打开的文件指针。

fputc:从指定的文件中写入一个字符

函数原型:int fputc(int c,FILE *stream)

函数参数说明:

c:输出字符量;

stream:已打开的文件指针。

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

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

4、 编写程序并调试;

5、 截屏输出实验结果;

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

六、实验数据及源代码(学生必须提交自己设计的程序源代码,并有注释,源代码电子版也一并提交),包括思考题的程序。

#include <stdio.h>
#include <stdlib.h>
void main(){
  FILE *fpr,*fpw;
  fpr = fopen("file.txt","r"); //以只允许读的方式打开文件
  if (fpr==NULL) {//读取文件失败
    printf("读取文件失败!\n");
    exit(1);//异常退出
  }
  fpw = fopen("copy.txt","w");//打开用于存储备份文件的文件,如果没有该文件则创建一个
  if (fpw==NULL) {//创建文件失败
    printf("创建文件失败!\n");
    exit(1);//异常退出
  }
  char buf[100]={0};//申请数据空间
  int byteNum= 0;//记录已读取的字节数
  while ((byteNum=fread(buf, sizeof(char),1, fpr)) > 0){//读取成功
    fwrite(buf,sizeof(char),byteNum,fpw);//进行备份写入
  }
printf("文件备份成功!\n");
  fclose(fpr);//关闭文件
  fclose(fpw);
}

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

1.浏览Linux系统根目录下的子目录,熟悉每个目录的文件和功能;

Linux目录结构和Windows的有很大的不同,Linux的目录结构是树形结构,最顶层是根目录。可以看到,Linux系统根目录下的子目录有bin、boot、cdrom 、dev、etc、home、lib lib32、lib64、libx32、lost+found、media、mnt、opt、proc、root、run、sbin、snap、srv、swapfile sys、tmp、usr、var。基本上各目录的文件和功能在实验原理上面都有介绍,但是有一些目录在实验原理上面是没有的,下面是它们的文件和功能的介绍:

lost+found:当系统出现意外导致文件丢失,可以在这里找回丢失的文件,其作用是用来存放fask过程中部分修复的文件。

run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。

swapfile:是一个内存交换分区文件。

sys:用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。

var:某些大文件的溢出区,比方说各种服务的日志文件。常见的子目录有:

/var/cache:应用程序本身运行过程中会产生的一些暂存文件。

/var/lib:程序本身执行过程中需要使用到的数据文件放置的目录。

/var/lock:对某些只能一次被一个应用程序所使用的文件或设备上锁。

/var/log:登录文件放置日志的目录。

/var/run:某些程序启动服务后在该目录下放置PID。

2.设计程序模拟实现Linux文件系统的简单I/O流操作:备份文件。

OS文件夹:

file.txt文件:

运行程序进行备份:

备份后的OS文件夹:

copy.txt:

一开始我的OS文件夹里面并没有copy.txt这个文件,但是有file.txt这个文件,程序要做的是用fopen函数打开file.txt文件,并且创建一个copy.txt文件,然后用fread函数读取file.txt文件的内容,最后用fwrite函数向copy.txt文件中写入读出的内容。可以看到程序运行结束后OS文件夹里面多了一个copy.txt文件,并且里面的内容和file.txt的内容一致,说明备份成功。

思考题:

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

系统调用 open 用于创建一个新的文件描述符。open 建立了一条到文件或设备的访问路径,如果调用成功,它将返回一个可以被 read、write 和其他系统调用使用的文件描述符。而read调用函数则从文件描述符相关联的文件里读入n个字节的数据,并把它们放到数据缓冲区中。系统调用 write 则是把缓冲区的前n个字节写入与文件描述符关联的文件中。系统调用close则关闭文件描述符与其对应文件之间的关联。

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

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

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

(1)库函数是语言或应用程序的一部分,而系统调用是内核提供给应用程序的接口,属于系统的一部分;

(2)库函数在用户地址空间执行,系统调用是在内核地址空间执行,库函数运行时间属于用户时间,系统调用属于系统时间,库函数开销较小,系统调用开销较大;

(3)库函数是有缓冲的,系统调用是无缓冲的;

(4)系统调用依赖于平台,库函数并不依赖。

相关文章
|
3月前
|
Web App开发 移动开发 Linux
DP读书:《openEuler操作系统》(七)FSCK与VFS虚拟文件系统
DP读书:《openEuler操作系统》(七)FSCK与VFS虚拟文件系统
76 0
|
6月前
|
Linux 开发工具
Linux操作系统6:文件系统及磁盘管理
Linux操作系统6:文件系统及磁盘管理
96 0
|
3月前
|
存储 索引
操作系统基础:文件系统基础【上】
操作系统基础:文件系统基础【上】
|
7月前
|
Linux Shell Go
《Linux操作系统编程》 第五章 文件和文件系统: 了解文件和文件系统的概念和特性,掌握Linux文件系统的基本操作
《Linux操作系统编程》 第五章 文件和文件系统: 了解文件和文件系统的概念和特性,掌握Linux文件系统的基本操作
71 0
|
3月前
|
数据安全/隐私保护 索引 Windows
操作系统基础:文件系统基础【下】
操作系统基础:文件系统基础【下】
|
3月前
|
C语言
操作系统 | proc文件系统
操作系统 | proc文件系统
19 0
|
3月前
|
存储 Unix 程序员
非常详细!操作系统基础【文件系统实现】
非常详细!操作系统基础【文件系统实现】
132 0
|
3月前
|
存储 数据安全/隐私保护 索引
非常详细!操作系统:【文件系统概述】
非常详细!操作系统:【文件系统概述】
|
3月前
|
存储 块存储 索引
建议收藏!操作系统基础:文件系统实现【下】
建议收藏!操作系统基础:文件系统实现【下】
|
3月前
|
存储 文件存储
DP读书:《openEuler操作系统》(六)文件系统
DP读书:《openEuler操作系统》(六)文件系统
47 1