2017011463-孟启贤-实验四-Linux下的C语言编程

上传人:good****022 文档编号:116444822 上传时间:2022-07-05 格式:DOC 页数:12 大小:350KB
返回 下载 相关 举报
2017011463-孟启贤-实验四-Linux下的C语言编程_第1页
第1页 / 共12页
2017011463-孟启贤-实验四-Linux下的C语言编程_第2页
第2页 / 共12页
2017011463-孟启贤-实验四-Linux下的C语言编程_第3页
第3页 / 共12页
点击查看更多>>
资源描述
实 验 报 告课程名称 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、写出实验报告,内容是:简要说明实验的目的、任务与设备。写出实现的技术手段及关键代码。总结设计中遇到的问题及解决方法。写出实验心得与收获。六、使用系统调用时的注意事项以下列出了几条系统调用和库函数有关出错处理的不同点,更多的内容还需大家通过编程积累。对于 studio 库中的函数,出错时会返回一个预定义的常量 EOF 或NULL;许多库函数在出错时常常返回 0 或 1 ;有些库函数则返回某种出错代码。系统调用的出错处理比较简单,每个系统调用在出错时都返回 1 ,在调用成功时返回 0 (或某些其他具有特定意义的整数值)。LINUX 系统调用把出错代码放在一个名为 error 的外部变量中,在程序中包含头文件 error.h,便可以得到 error 的错误代码。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 机械制造 > 工业自动化


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!