实验3
文件子系统——文件操作
实验类别:设计实验学时:2学时
开设该课程的单位是计算机学院计算机科学与技术系实验基地——:建新校区计算机中心
一、实验目的
通过本实验练习,学生可以掌握文档管理和文档操作的内容。首先
熟悉LINUX系统下文件系统的构建方法;其次,我们应该熟练掌握LINUX。
环境下用C语言进行高级编程的方法(即进行与文件操作相关的系统调用的方法
用),然后充分理解LINUX文件系统外壳命令的实现原理及其用途
系统调用。
二、实验环境
操作系统:任何Unix/Linux和Sun Solaris或windows系列
应用系统:gcc编译器。如果操作系统是windows系列,还需要相应的模拟环境。
Iii .预备知识
1.关于系统调用和库函数
c语言支持一系列库函数调用,其中最基本的是studio库函数。东西
事实上,库函数只是C语言在更高层次上调用的方式,而系统调用是较低的。
C语言的分层接口是内核提供给用户调用的一个函数。
2.LINUX环境下系统调用与库函数的异同
(1)C程序用来调用系统的语句与用来调用库函数的语句完全相同,但是
两者的运行环境和机制完全不同。
(2)从运行环境的角度来看,库函数依赖于运行的用户环境,程序调用库函数
函数,它运行的目标代码属于程序,程序在“用户状态”下执行。
系统调用的使用并不依赖于运行它的用户环境,而是由LINUX内核提供的。
7、系统调用时执行的代码属于内核,而程序是在“内核
“实现的心态。
(3)库函数的调用最终通过LINUX系统调用来实现。图书馆功能
通常,指令(操作系统陷阱操作
系统陷阱)
将进程执行模式更改为核心状态,然后让核心执行系统调用的代码。
四.实验内容
这个实验需要在LINUX/UNIX环境下用C语言编写三个特定的SHELL
命令,基本上涉及到了LINUX/UNIX文件系统中较为常用的文件操作系统
系统调用。内容如下:
(1)编程实现复制命令和执行格式:复制
文件1
文件2
文件3
函数:将文件1和文件2的内容复制到文件3中,中间有30个。
一个字节洞。
可以通过: read(),write(),open(),create(),
close(),lseek()
完成后,请注意文件文件的大小和内容3。
实验代码:
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char const *argv[])
{
int文件1、文件2、文件3;
文件1=打开(参数[1],只读);
文件2=打开(参数[2],只读);
文件3=打开(参数[3],O_CREAT|O_RDWR,S _ IRWXU);
int n;
char buf[1024];
而((n=read(file1,buf,1024))0)
写(文件3,buf,n);
lseek(文件3,30,SEEK _ END);
而((n=read(file2,buf,1024))0)
写(文件3,buf,n);
关闭(文件1);
关闭(文件2);
关闭(文件3);
printf(' finish \ n ');
返回0;
}
实验截图:
(2)在LINUX下编程实现重命名命令。它的功能是重命名文件。
执行格式:renam
filea
fileb
其中,文件a是源文件,文件b是目标文件
可以通过: read(),write(),open(),create(),
关闭(),链接(),取消链接()
实验代码:
#包括
#包括
#包括
int main(int argc,char* argv[])
{
链接(argv[1],argv[2]);
取消链接(argv[1]);
printf(' finish \ n ');
返回0;
}
实验截图:
(3)编程实现:使用符号链接()在当前目录中创建文件f1的符号链接文件f2。
在理解stat结构内容的基础上,我们分别使用stat()和lstat()系统调用来显示
文件f2中的信息(即stat结构的内容)比较了两个输出结果之间的异同。
8次通过序列中可能涉及的系统有:开(),关(),stat(),lstat(),
符号链接()
实验代码:
#包括
#包括
#包括
#包括
int main(int argc,char* argv[])
{
结构状态;
/*链接*/
symlink(argv[1],argv[2]);
stat(argv[2],状态);
printf(“% s stat size=% d字节\n”,argv[2],(int)state . ST _ size);
lstat(argv[2],state);
printf(“% s lstat大小=%d字节\n”,argv[2],(int)state . ST _ size);
返回0;
}
实验截图:
五、实验结果
通过这次实验,我掌握了文件管理和文件操作的内容,学会了在ubuntu环境下编写简单的C程序,学会了用C语言编写和实现复制命令。
编程实现renam(即在LINUX下重命名)命令,编程实现:使用符号链接()来创建当前目录下文件f1的符号链接文件f2,
在理解stat结构内容的基础上,stat()和lstat()系统调用用于显示文件f2的信息(即stat结构的内容)。
六、使用系统调用时的注意事项
以下是关于错误处理的系统调用和库函数之间的一些区别。更多
能力仍然需要通过规划来积累。
(1)对于studio库中的函数,当发生错误时,将返回一个预定义的常量EOF或。
空;发生错误时,许多库函数通常返回0或1;一些库函数返回
回到某种错误代码。
(2)系统调用的错误处理相对简单。发生错误时,每个系统调用返回1。
当调用成功时,返回0(或其他具有特定含义的整数值)。LINUX系统
系统调用将错误代码放在程序中包含的名为error的外部变量中
头文件错误,你可以得到错误代码。