




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实 验 报 告课程名称 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 系统调用来实现,库函数一般执行一条指令,该指令(操作系统陷阱 operating systemtrap)将进程执行方式变为核心态,然后使内核为系统调用执行代码。四(1)、实验内容本实验要求在 LINUX/UNIX 环境下用 C 语言完成 SHELL 命令的编写,基本涉及了 LINUX/UNIX 文件系统中较为常用的有关文件操作的系统调用。内容如下:1、编程实现 lnk 命令,执行格式:lnkf1f2f3。具体要求如下:分别使用 link()和 symlink()为文件 f1(任意)创建其硬链接文件 f2 和符号链接文件 f3。分别使用 stat()和 lstat()调用给出文件 f2 和 f3 的索引节点号、权限、存放该文件的设备号及文件修改时间,比较其异同。说明原因。#include #include #include #include #includeint main(int argc, char const *argv)struct stat buf; if (argc!=4) printf(input errorn); return 0; if (link(argv1,argv2)=-1) printf(link errorn);return 0; if (symlink(argv1,argv3)=-1) printf(symlink errorn);return 0; if (stat(argv2, &buf) = -1)printf(stat f2 errorn); return 0;printf(stat f2n); printf(索引号节点号: %ldn,buf.st_ino); printf(权限: %on, buf.st_mode); printf(设备号: %ldn,buf.st_dev); printf(文件修改时间: %ldn,buf.st_mtime); if (stat(argv3, &buf) = -1)printf(stat f3 errorn); return 0;printf(stat f3n); printf(索引号节点号: %ldn,buf.st_ino); printf(权限: %on, buf.st_mode); printf(设备号: %ldn,buf.st_dev); printf(文件修改时间: %ldn,buf.st_mtime); if (lstat(argv2, &buf) 0)printf(lstat f2 errorn); return 0;printf(lstat f2n); printf(索引号节点号: %ldn,buf.st_ino); printf(权限: %on, buf.st_mode); printf(设备号: %ldn,buf.st_dev); printf(文件修改时间: %ldn,buf.st_mtime); if (lstat(argv3, &buf) 0)printf(lstat f3 errorn); return 0;printf(lstat f3n); printf(索引号节点号: %ldn,buf.st_ino); printf(权限: %on, buf.st_mode); printf(设备号: %ldn,buf.st_dev); printf(文件修改时间: %ldn,buf.st_mtime); printf(finished);return 0;结果如下:原因: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()#include #include #include #include #include int main(int argc,char *argv)char s;struct stat buf; if (argc!=3) printf(input errorn); return 0; /*f1*/int a=open(f1,O_CREAT|O_TRUNC|O_RDWR);if(a=-1)printf(ERROR!);if (stat(f1, &buf) = -1)printf(stat f1 errorn); return 0;printf(stat f1n); printf(大小: %ldn,buf.st_size); printf(最近一次状态时间: %ldnn,buf.st_ctime); if (lstat(f1, &buf) 0)printf(lstat f1 errorn); return 0;printf(lstat f1n); printf(大小: %ldn,buf.st_size); printf(最近一次状态时间: %ldnn,buf.st_ctime); if (fstat(a, &buf) 0)printf(fstat f1 errorn); return 0;printf(fstat f1n); printf(大小: %ldn,buf.st_size); printf(最近一次状态时间: %ldnn,buf.st_ctime); /*f2*/int b=open(f2,O_CREAT|O_TRUNC);if(b=-1)printf(ERROR!);if (stat(f2, &buf) = -1)printf(stat f2 errorn); return 0;printf(stat f2n); printf(大小: %ldn,buf.st_size); printf(最近一次状态时间: %ldnn,buf.st_ctime); if (lstat(f2, &buf) 0)printf(lstat f2 errorn); return 0;printf(lstat f2n); printf(大小: %ldn,buf.st_size); printf(最近一次状态时间: %ldnn,buf.st_ctime); if (fstat(b, &buf) 0)printf(fstat f2 errorn); return 0;printf(fstat f2n); printf(大小: %ldn,buf.st_size); printf(最近一次状态时间: %ldn,buf.st_ctime); close(b);/*f3*/int c=open(f3,O_CREAT|O_TRUNC);if(c=-1)printf(ERROR!);if (stat(f3, &buf) = -1)printf(stat f3 errorn); return 0;printf(stat f3n); printf(大小: %ldn,buf.st_size); printf(最近一次状态时间: %ldnn,buf.st_ctime); if (lstat(f3, &buf) 0)printf(lstat f3 errorn); return 0;printf(lstat f3n); printf(大小: %ldn,buf.st_size); printf(最近一次状态时间: %ldnn,buf.st_ctime); if (fstat(c, &buf) 0) if ( write(a,&buf,n)!=n)printf(a/write errorn);if (n0) if ( write(a,buf2,m)!=m)printf(d/write errorn);if (m=0)printf(read errorn);if (stat(f2, &buf) = -1)printf(stat f2 errorn); return 0;printf(stat f2 的大小n); printf(大小: %ldn,buf.st_size);close(a);int z=open(“f1”,O_RDONLY);while(read(z,s,1)printf(%c,s);printf(n);close(d);close(a);return 0;截图如下:四(2)实验总结通过这次实验熟悉了linux下文件系统的构建方法,学会了如何使用gcc编译c文件,和使用out的输入和操作。更加熟悉了read()、open()、lseek()等等的使用方法,以及他们的反映执行结果的返回值,也明白了硬链接和软连接的区别,以及stat和lstat了解文件信息,以及他们的区别。五、实验要求1、做好实验预习,通过查找资料、阅读系统提供的帮助文件等多种渠道了解本实验所使用的系统调用及各种技术方法。充分利用所学知识,尽可能多地预设实现思路。2、写出实验报告,内容是:简要说明实验的目的、任务与设备。写出实现的技术手段及关键代码。总结设计中遇到的问题及解决方法。写出实验心得与收获。六、使用系统
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 货物运输理论试题库与参考答案
- 职高作文题库及答案
- 2025派遣人员劳动合同范本
- 室内装饰设计师四级复习试题及答案
- 2025铝合金模板安装劳务分包合同
- 2025年防爆工程师考试试题及答案
- 2025酒店转让合同协议范本
- 2025年山东女性考试题目及答案
- 想象训练题目及答案
- 2025私营企业员工宿舍租赁合同
- 教师在线教学能力提升学习总结
- 交通安全培训(摩托车电动车)
- 医院培训课件:《胰岛素规范化注射》
- 木材加工质量控制与验收考核试卷
- 《布病防控知识》课件
- 低空经济产业标准体系规划研究
- 保育员应掌握的工作技能(完整版)
- 贵州省遵义市(2024年-2025年小学六年级语文)部编版小升初模拟((上下)学期)试卷及答案
- 路灯安装工程项目实施的重点、难点和解决方案
- 2024年中国蚕桑产业发展现状及促进蚕桑产业发展的措施分析
- 《初级会计实务》(第五版) 第三章 流动资产
评论
0/150
提交评论