您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 2017011463-孟启贤-实验四-Linux下的C语言编程
实验报告课程名称Linux系统实践__实验项目Linux下的C语言编程实验仪器PC___________系别计算机学院___专业网络工程____班级/学号网1702/2017011463学生姓名孟启贤_____实验日期5.13______成绩___________________指导教师李艳平____实验四Linux下的C语言编程实验类别:设计型实验时数:6学时开课单位:计算机学院实验地点:健翔校区计算中心一、实验目的通过本实验练习,使学生掌握有关文件管理与文件操作的内容。首先要熟悉在LINUX系统下文件系统的构建方法;其次要熟练掌握在LINUX环境下用C语言进行高级编程的方法(即有关文件操作的系统调用的使用),进而充分了解LINUX文件系统中shell命令的实现原理以及用到的系统调用。二、实验环境操作系统:任何Unix/Linux或MAC编译器:gcc三、预备知识1、关于系统调用和库函数C语言支持一系列的库函数的调用,其中最基本的是studio库函数。事实上,库函数只是C语言在较高层次上调用的方式,系统调用是更低层次的与C语言的界面,是内核提供给用户调用的函数。2、LINUX环境下系统调用和库函数的异同⑴C程序使用系统调用的语句和调用库函数的语句形式完全相同,但是二者运行的环境和运行机制截然不同。⑵从运行环境来看,库函数使用依赖于所运行的用户环境,程序调用库函数时,它运行的目标代码是属于程序的,程序处于“用户态”执行;而系统调用的使用不依赖于它运行的用户环境,是LINUX内核提供的低层服务,系统调用时所执行的代码是属于内核的,程序处于“核心态”执行。⑶程序库函数的调用最终还是要通过LINUX系统调用来实现,库函数一般执行一条指令,该指令(操作系统陷阱operatingsystemtrap)将进程执行方式变为核心态,然后使内核为系统调用执行代码。四(1)、实验内容本实验要求在LINUX/UNIX环境下用C语言完成SHELL命令的编写,基本涉及了LINUX/UNIX文件系统中较为常用的有关文件操作的系统调用。内容如下:1、编程实现lnk命令,执行格式:lnkf1f2f3。具体要求如下:⑴分别使用link()和symlink()为文件f1(任意)创建其硬链接文件f2和符号链接文件f3。⑵分别使用stat()和lstat()调用给出文件f2和f3的索引节点号、权限、存放该文件的设备号及文件修改时间,比较其异同。说明原因。#includesys/types.h#includesys/stat.h#includefcntl.h#includeunistd.h#includestdio.hintmain(intargc,charconst*argv[]){structstatbuf;if(argc!=4){printf(inputerror\n);return0;}if(link(argv[1],argv[2])==-1){printf(linkerror\n);return0;}if(symlink(argv[1],argv[3])==-1){printf(symlinkerror\n);return0;}if(stat(argv[2],&buf)==-1){printf(statf2error\n);return0;}printf(statf2\n);printf(索引号节点号:%ld\n,buf.st_ino);printf(权限:%o\n,buf.st_mode);printf(设备号:%ld\n,buf.st_dev);printf(文件修改时间:%ld\n,buf.st_mtime);if(stat(argv[3],&buf)==-1){printf(statf3error\n);return0;}printf(statf3\n);printf(索引号节点号:%ld\n,buf.st_ino);printf(权限:%o\n,buf.st_mode);printf(设备号:%ld\n,buf.st_dev);printf(文件修改时间:%ld\n,buf.st_mtime);if(lstat(argv[2],&buf)0){printf(lstatf2error\n);return0;}printf(lstatf2\n);printf(索引号节点号:%ld\n,buf.st_ino);printf(权限:%o\n,buf.st_mode);printf(设备号:%ld\n,buf.st_dev);printf(文件修改时间:%ld\n,buf.st_mtime);if(lstat(argv[3],&buf)0){printf(lstatf3error\n);return0;}printf(lstatf3\n);printf(索引号节点号:%ld\n,buf.st_ino);printf(权限:%o\n,buf.st_mode);printf(设备号:%ld\n,buf.st_dev);printf(文件修改时间:%ld\n,buf.st_mtime);printf(finished);return0;}结果如下:原因:Stat对于硬链接和软连接都是返回链接所指文件的信息。但是对于lstst,如果文件是符号链接,lstat返回的是符号链接本身的信息。2、编程实现copy命令,执行格式:copycj.txtf1功能:⑴复制前先将文件f1(见1)的内容清空;⑵分别使用fstat()、stat()和lstat()调用给出文件f1、f2和f3大小及最近一次状态改变的时间;⑶将实验三新创建文件cj.txt中前100个字节的内容拷入f1中,在其后创建30个字节的空洞,然后再复制cj.txt中第141个字节之后的内容到f1中;⑷复制成功后,显示文件f2的大小及文件f1的内容。上述功能实现后可将空洞调大到几十~几百MB,然后用du命令显示文件f1占用的磁盘空间,观察其大小,分析原因。问题:①上述第⑵项中用fstat()替换stat()显示文件f2的信息可以吗?为什么?答:不可以,fstat是用文件的描述符指向文件。②比较上述第⑷项和第⑵项的结果,文件f2的大小为何有变化?F2是f1的硬链接,本质是一个文件,前面是对f1内容清空了,后面在f1中放入了一些内容,所以大小改变了。程序可能涉及到的系统调用:read(),write(),open(),creat(),close(),lseek(),stat(),fstat(),lstat()#includesys/types.h#includesys/stat.h#includefcntl.h#includeunistd.h#includestdio.hintmain(intargc,char*argv[]){chars;structstatbuf;if(argc!=3){printf(inputerror\n);return0;}/*f1*/inta=open(f1,O_CREAT|O_TRUNC|O_RDWR);if(a==-1){printf(ERROR!);}if(stat(f1,&buf)==-1){printf(statf1error\n);return0;}printf(statf1\n);printf(大小:%ld\n,buf.st_size);printf(最近一次状态时间:%ld\n\n,buf.st_ctime);if(lstat(f1,&buf)0){printf(lstatf1error\n);return0;}printf(lstatf1\n);printf(大小:%ld\n,buf.st_size);printf(最近一次状态时间:%ld\n\n,buf.st_ctime);if(fstat(a,&buf)0){printf(fstatf1error\n);return0;}printf(fstatf1\n);printf(大小:%ld\n,buf.st_size);printf(最近一次状态时间:%ld\n\n,buf.st_ctime);/*f2*/intb=open(f2,O_CREAT|O_TRUNC);if(b==-1){printf(ERROR!);}if(stat(f2,&buf)==-1){printf(statf2error\n);return0;}printf(statf2\n);printf(大小:%ld\n,buf.st_size);printf(最近一次状态时间:%ld\n\n,buf.st_ctime);if(lstat(f2,&buf)0){printf(lstatf2error\n);return0;}printf(lstatf2\n);printf(大小:%ld\n,buf.st_size);printf(最近一次状态时间:%ld\n\n,buf.st_ctime);if(fstat(b,&buf)0){printf(fstatf2error\n);return0;}printf(fstatf2\n);printf(大小:%ld\n,buf.st_size);printf(最近一次状态时间:%ld\n,buf.st_ctime);close(b);/*f3*/intc=open(f3,O_CREAT|O_TRUNC);if(c==-1){printf(ERROR!);}if(stat(f3,&buf)==-1){printf(statf3error\n);return0;}printf(statf3\n);printf(大小:%ld\n,buf.st_size);printf(最近一次状态时间:%ld\n\n,buf.st_ctime);if(lstat(f3,&buf)0){printf(lstatf3error\n);return0;}printf(lstatf3\n);printf(大小:%ld\n,buf.st_size);printf(最近一次状态时间:%ld\n\n,buf.st_ctime);if(fstat(c,&buf)0){printf(fstatf3error\n);return0;}printf(fstatf3\n);printf(大小:%ld\n,buf.st_size);printf(最近一次状态时间:%ld\n\n,buf.st_ctime);close(c);intd=open(cj.txt,O_CREAT|O_RDWR);if(d==-1){printf(ERROR!);}/*inte=open(f1,O_CREAT|O_TRUNC|O_RDWR);if(e==-1){printf(ERROR!);}*/intn;if((n=read(d,&buf,100))0){if(write(a,&buf,n)!=n){printf(a/writeerror\n);}}if(n0){printf(readerror\n);}if(lseek(d,141,SEEK_SET)==-1){printf(error!);}intm;if(lseek(a,30,SEEK_CUR)==-1){printf(error!);}charbuf2[1000];if((m=read(d,buf2,1000))0){if(write(a,buf2,m)!=m){printf(d/writeerror\n);}}if(m=0){printf(readerror\n);}if(stat(f2,&buf)==-1){printf(statf2error\n);return0;}printf(statf2的大小\n);printf(大小:%ld\n,buf.st_size);close(a);intz=open(“f1”,O_RDONLY);while(read(z,s,1)){printf(%c,s);}printf(\n);close(d);close(a);re
本文标题:2017011463-孟启贤-实验四-Linux下的C语言编程
链接地址:https://www.777doc.com/doc-5585071 .html