北京信息科技大学Linux实验报告3

更新时间:2023-12-25 09:22:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验三

文件子系统——文件操作

实验类别:设计型 实验时数:2 学时

开课单位:计算机学院计算机科学与技术系 实验地点:健翔校区计算中心

一、实验目的

通过本实验练习,使学生掌握有关文件管理与文件操作的内容。首先

要熟悉在 LINUX 系统下文件系统的构建方法;其次要熟练掌握在 LINUX

环境下用 C 语言进行高级编程的方法(即有关文件操作的系统调用的使

用),进而充分了解 LINUX 文件系统中 shell 命令的实现原理以及它们用到

的系统调用。

二、实验环境

操作系统:任何 Unix/Linux 及 Sun Solaris 或 windows 系列

应用系统:gcc 编译器。若 OS 为 windows 系列,则还需相应的模拟环境

三、预备知识

1、 关于系统调用和库函数

C 语言支持一系列的库函数的调用,其中最基本的是 studio 库函数。事

实上,库函数只是 C 语言在较高层次上调用的方式,系统调用是更低

层次的与 C 语言的界面,是内核提供给用户调用的函数。

2、 LINUX 环境下系统调用和库函数的异同

(1)C 程序使用系统调用的语句和调用库函数的语句形式完全相同,但是

二者运行的环境和运行机制截然不同。

(2)从运行环境来看,库函数使用依赖于所运行的用户环境,程序调用库

函数时,它运行的目标代码是属于程序的,程序处于―用户态‖执行;

而系统调用的使用不依赖于它运行的用户环境,是 LINUX 内核提供

7的低层服务,系统调用时所执行的代码是属于内核的,程序处于―核

心态‖执行。

(3)程序库函数的调用最终还是要通过 LINUX 系统调用来实现,库函数

一般执行一条指令,该指令(操作系统陷阱 operating

system trap)

将进程执行方式变为核心态,然后使内核为系统调用执行代码。

四、实验内容

本实验要求在 LINUX/UNIX 环境下用 C 语言编写三个具体的 SHELL

命令,基本涉及了 LINUX/UNIX 文件系统中较为常用的有关文件操作的系

统调用。内容如下:

(1)编程实现 copy 命令,执行格式:copy file1 file2 file3

功能:将 file1、file2 两文件的内容合并拷入 file3 中,其中间应有 30

个字节的空洞。

程 序 可 能 涉 及 到 的 系 统 调 用 : read(), write(), open(), creat(),

close(), lseek()

完成后,注意查看文件 file3 的大小和内容。 实验代码:

#include #include #include #include #include #include

int main(int argc, char const *argv[]) { int file1,file2,file3; file1=open(argv[1],O_RDONLY); file2=open(argv[2],O_RDONLY); file3=open(argv[3],O_CREAT|O_RDWR,S_IRWXU); int n;

char buf[1024]; while (( n=read(file1,buf,1024))>0) write(file3,buf,n); lseek(file3,30,SEEK_END); while (( n=read(file2,buf,1024))>0) write(file3,buf,n); close(file1); close(file2); close(file3); printf(\ return 0; }

实验截图:

(2)编程实现 renam(即 LINUX 下的 rename)命令,功能是实现文件的重命名。

执行格式:renam filea

fileb;

其中 filea 为源文件,fileb 为目标文件

程 序 可 能 涉 及 到 的 系 统 调 用 : read(), write(), open(), creat(),

close(), link(), unlink()

实验代码:

#include #include

#include

int main(int argc,char* argv[]) { link(argv[1],argv[2]); unlink(argv[1]); printf(\ return 0; }

实验截图:

(3)编程实现:使用 symlink()创建当前目录下文件 f1 的符号链接文件 f2,

在理解 stat 结构内容的基础上分别使用 stat()和 lstat()系统调用显示

文件 f2 的信息(即 stat 结构的内容),比较两次输出的结果有何异同。

8程 序 可 能 涉 及 到 的 系 统 调 用 : open(), close(),stat() , lstat() ,

symlink()

实验代码:

#include #include #include #include

int main(int argc,char* argv[]) { struct stat state; /*链接*/ symlink(argv[1],argv[2]);

stat(argv[2], &state); printf(\的stat大小=%d字节\\n\ lstat(argv[2], &state); printf(\的lstat大小=%d字节\\n\ return 0; }

实验截图:

五、实验心得

通过本次实验掌握有关文件管理与文件操作的内容学会了编写简单的c程序在ubuntu环境下应用学会了用c语言编写实现 copy 命令,

编程实现 renam(即 LINUX 下的 rename)命令, 编程实现:使用 symlink()创建当前目录下文件 f1 的符号链接文件 f2,

在理解 stat 结构内容的基础上分别使用 stat()和 lstat()系统调用显示文件 f2 的信息(即 stat 结构的内容。

六、使用系统调用时的注意事项

以下列出了几条系统调用和库函数有关出错处理的不同点,更多的内

容还需大家通过编程积累。

(1)对于 studio 库中的函数,出错时会返回一个预定义的常量 EOF 或

NULL;许多库函数在出错时常常返回 0 或 –1 ;有些库函数则返

回某种出错代码。

(2)系统调用的出错处理比较简单,每个系统调用在出错时都返回 –1 ,

在调用成功时返回 0 (或某些其他具有特定意义的整数值)。 LINUX 系

统调用把出错代码放在一个名为 error 的外部变量中,在程序中包含

头文件 error.h,便可以得到 error 的错误代码。

本文来源:https://www.bwwdw.com/article/ooyx.html

Top