《2017011463-孟启贤-实验四-Linux下的C语言编程》由会员分享,可在线阅读,更多相关《2017011463-孟启贤-实验四-Linux下的C语言编程(12页珍藏版)》请在金锄头文库上搜索。
1、实 验 报 告课程名称 Linux系统实践_实验项目 Linux 下的 C 语言编程实验仪器 PC_系 别 计算机学院_专 业 网络工程_班级/学号 网1702/2017011463学生姓名 孟启贤_实验日期 5.13_成 绩 _指导教师 李艳平_实验四Linux 下的 C 语言编程实验类别:设计型实验时数:6 学时开课单位:计算机学院实验地点:健翔校区计算中心一、实验目的通过本实验练习,使学生掌握有关文件管理与文件操作的内容。首先要熟悉在 LINUX 系统下文件系统的构建方法;其次要熟练掌握在 LINUX环境下用 C 语言进行高级编程的方法(即有关文件操作的系统调用的使用),进而充分了解 L
2、INUX 文件系统中 shell 命令的实现原理以及用到的系统调用。二、实验环境操作系统:任何 Unix/Linux 或 MAC编译器:gcc三、预备知识1、 关于系统调用和库函数C 语言支持一系列的库函数的调用,其中最基本的是 studio 库函数。事实上,库函数只是 C 语言在较高层次上调用的方式,系统调用是更低层次的与 C 语言的界面,是内核提供给用户调用的函数。2、 LINUX 环境下系统调用和库函数的异同C 程序使用系统调用的语句和调用库函数的语句形式完全相同,但是二者运行的环境和运行机制截然不同。从运行环境来看,库函数使用依赖于所运行的用户环境,程序调用库函数时,它运行的目标代码是
3、属于程序的,程序处于“用户态”执行;而系统调用的使用不依赖于它运行的用户环境,是 LINUX 内核提供的低层服务,系统调用时所执行的代码是属于内核的,程序处于“核心态”执行。程序库函数的调用最终还是要通过 LINUX 系统调用来实现,库函数一般执行一条指令,该指令(操作系统陷阱 operating systemtrap)将进程执行方式变为核心态,然后使内核为系统调用执行代码。四(1)、实验内容本实验要求在 LINUX/UNIX 环境下用 C 语言完成 SHELL 命令的编写,基本涉及了 LINUX/UNIX 文件系统中较为常用的有关文件操作的系统调用。内容如下:1、编程实现 lnk 命令,执行
4、格式: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(a
5、rgv1,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,b
6、uf.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); pr
7、intf(索引号节点号: %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); pri
8、ntf(文件修改时间: %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 个字节的
9、空洞,然后再复制 cj.txt 中第 141 个字节之后的内容到 f1 中;复制成功后,显示文件 f2 的大小及文件 f1 的内容。上述功能实现后可将空洞调大到几十几百 MB,然后用 du 命令显示文件 f1 占用的磁盘空间,观察其大小,分析原因。问题:上述第项中用 fstat()替换 stat()显示文件 f2 的信息可以吗?为什么?答:不可以,fstat是用文件的描述符指向文件。比较上述第项和第项的结果,文件 f2 的大小为何有变化?F2是f1的硬链接,本质是一个文件,前面是对f1内容清空了,后面在f1中放入了一些内容,所以大小改变了。程序可能涉及到的系统调用:read(), write(
10、), 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)prin
11、tf(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 error
12、n); 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(lst