在这里插入图片描述

相关资料

广州大学2020操作系统实验一:进程管理与进程通信
广州大学2020操作系统实验二:银行家算法
广州大学2020操作系统实验三:内存管理
广州大学2020操作系统实验四:文件系统
广州大学2020操作系统实验五:磁盘管理实验
五份实验报告下载链接🔗

课程设计下载链接🔗

一、实验目的

1、熟悉Linux文件系统的文件和目录结构,掌握Linux文件系统的基本特征;
2、模拟实现Linux文件系统的简单I/O流操作:备份文件。

二、实验内容

1、浏览Linux系统根目录下的子目录,熟悉每个目录的文件和功能;
2、设计程序模拟实现Linux文件系统的简单I/O流操作:备份文件。

三、实验原理

四、实验中用到的系统调用函数(包括实验原理中介绍的和自己采用的),自己采用的系统调用函数要按照指导书中的格式说明进行介绍。

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

五、实验步骤

要求写出实验过程和思路。

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

C库函数fopen(), fread(), fwrite(), fclose()
1)fopen函数
函数原型:FILE *fopen(const char *path, const char *mode);
参数:
path:可能的值:常量字符串(如:“/home/dir/test.txt”),字符串指针(如:char
mode:可选参数有“r” “w” “a” “r+” “w+” “a+” “其他选项+b”
返回值:成功打开文件返回FILE指针(文件流),失败返回NULL;一般会判断该返回值再执行后续任务;

2)fclose函数
函数原型:int fclose(FILE *fp);
参数:
fp:成功打开文件返回的FILE指针
功能主要是关闭该文件流,释放指针;
返回值:成功返回0,失败EOF (-1);

3)fread函数
函数原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:
ptr:用来存储文件内容开辟的内存空间指针或说地址,可以是数组名或者指向malloc分配的内存的指针;
size:读取的块个数,跟nmemb配合使用;size为1,表示读取一个大小为nmemb的文件内容到ptr指向内存中;
nmemb:一次读取的文件内容大小,一般是ptr指向的内存大小,当然前提是size为1;
stream:就是fopen打开文件返回值;
返回值:成功返回读取内容的大小,在size为1时一般小于等于nmemb值,失败或者文件末尾返回0。

4)fwrite函数
函数原型:size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:
ptr:待写内容的地址;
size:写入的块个数,跟nmemb配合使用;size为1,表示写入一个大小为nmemb的内容到文件中;
nmemb:一次写入文件的内容大小,一般是ptr指向的内存大小,当然前提是size为1;
stream:就是fopen打开文件返回值;
返回值:成功返回写入内容的大小,失败或者文件末尾返回0。

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

在这里插入图片描述

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

Clibrary.c C库函数

#include <stdio.h>
#include <stdlib.h>

void main()
{
FILE *fpr = NULL,*fpw = NULL;
fpr = fopen("file.txt", "r"); //只允许读
if (!fpr) {
printf("读取文件失败!\n");
exit(1);
}
fpw = fopen("copy.txt", "w");//覆盖原有内容
if (!fpw) {
printf("创建文件失败!\n");
exit(1);
}
char* ptr = (char*)malloc(sizeof(char)* 1024); //进行读写操作
int number = 0;
while ((number = fread(ptr, sizeof(char), 1024, fpr)) > 0)
fwrite(ptr, sizeof(char), number, fpw);

fclose(fpr); //关闭文件
fclose(fpw);
return;
}

system.c 系统调用

#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 

void main()
{ 
int in, out, number; 
in = open("file.txt", O_RDONLY); //只允许读
if (in == -1) {
printf("读取文件失败!\n");
exit(1);
} 
out = open("copy.txt", O_CREAT|O_WRONLY,S_IRWXU); //只允许写
if (out == -1) {
printf("创建文件失败!\n");
exit(1);
}
char buffer[1024]; 
while ((number = read(in, buffer, 1024)) > 0) //进行读写操作 
write(out, buffer, number); 
close(in); //关闭文件
close(out); 
return; 
} 
七、实验结果分析(截屏的实验结果,与实验结果对应的实验分析)
1、浏览Linux系统根目录下的子目录,熟悉每个目录的文件和功能;

在这里插入图片描述

浏览bin和dev这两个重要的目录下的文件
在这里插入图片描述
在这里插入图片描述

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

备份文件内容如下:
Operating System (OS) is a collection of System software that manages computer hardware resources, controls the operation of other programs and provides users with interactive Operating interfaces. Operating system is a key component of computer system, responsible for the management and configuration of memory, determine the priority of system resource supply and demand, control input and output devices, operation network and management file system and other basic tasks. Operating systems can range from simple to complex, from embedded operating systems for mobile phones to large operating systems for supercomputers. Currently popular modern operating systems are Mainly Android, BSD, iOS, Linux, Mac OS X, Windows, Windows Phone and Z /OS, etc. In addition to Windows and Z /OS and a few operating systems, most operating systems are UNIX-like operating systems.

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

(一)系统调用 open 用于创建一个新的文件描述符。open 建立了一条到文件或设备的访问路径。如果调用成功,它将返回一个可以被 read、write 和其他系统调用使用的文件描述符。
(二)系统调用 read 的作用是:从文件描述符 fildes 相关联的文件里读入 nbytes 个字节的数据,并把它们放到数据区 buf 中。
(三)系统调用 write 的作用是把缓冲区 buf 的前 nbytes 个字节写入与文件描述符 fildes 关联的文件中。它返回实际写入的字节数。
(四) 系统调用 close 可以用来终止文件描述符 fildes 与其对应文件之间的关联。

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

(一)C库函数的作法是将要处理的数据先存入缓冲区内,等到缓冲区装满了,再将数据一次写入或者读出。这种方式处理小量数据时效率比较高。
(二)库函数对文件的操作实际上是通过以上的系统调用来实现的。例如C库函数fwrite()就是通过write()系统调用来实现的。

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

(一)系统调用函数:在用户态调用,在内核态执行;C库函数:在用户态调用,在用户态执行。
(二)各个系统的系统调用是不同的;C函数库是相同的。
(三)系统调用需要在切换到内核上下文环境再切换回来,开销比较大;而C库函数属于过程调用,开销比较小。

GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐