.
实验报告
课程名称:LINUX系统实践
实验项目:Linux 下的C语言编程实验仪器:PC机gcc编译器
学院:计算机学院
专业:计算机科学与技术班级姓名:计科1601班罗坤学号:**********
日期:2018年5月20日指导教师:***
同组成员:
成绩:
一.实验目的
1.通过本实验练习,使学生掌握有关文件管理与文件操作的内容。
首先要
熟悉在LINUX系统下文件系统的构建方法;
2.其次要熟练掌握在LINUX 环境下用C 语言进行高级编程的方法(即有
关文件操作的系统调用的使用),进而充分了解LINUX 文件系统中
shell 命令的实现原理以及它们用到的系统调用。
二.实验内容
本实验要求在LINUX/UNIX 环境下用 C 语言编写三个具体的SHELL 命令,基本涉及了LINUX/UNIX 文件系统中较为常用的有关文件操作的系统调用。
内容如下:
1.编程实现copy 命令,执行格式:copy file1 file2 file3 功能:将file1、
file2 两文件的内容合并拷入file3 中,其中间应有30 个字节的空洞
(调试成功后可将空洞调大到几十MB)。
程序执行后用du 命令显示其
占用磁盘空间,观察其大小,分析原因。
程序可能涉及到的系统调用:
read(), write(), open(), creat(), close(), lseek()
2.编程实现renam(即LINUX 下的rename)命令,功能是实现文件的重命
名。
执行格式:renam filea fileb;其中filea 为源文件,fileb 为目标
文件。
程序执行时应显示出命令行的所有参数,并给出重命名前后两
个文件的大小、索引节点号及最近一次状态改变的时间。
程序可能涉
及到的系统调用:read(), write(), open(), stat(), close(), link(), unlink()
3.编程实现lnk 命令,执行格式:lnk f1 f2 f3。
具体要求如下:⑴分别使
用link()和symlink()为文件f1 创建其硬链接文件f2 和符号 3 链接
文件f3。
⑵分别使用stat()和lstat()调用给出文件f2 和f3 大小、索
引节点号、权限、存放该文件的设备号及文件修改时间,比较其异同。
说明原因。
三.实验过程
第一题
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<stdio.h>
int main(int argc,char const * argv[])
//argc是参数个数,argv是指向参数的指针数组
{
int file1,file2,file3;
file1=open(argv[1],O_RDONLY);
file2=open(argv[2],O_RDONLY);
file3=open(argv[3],O_CREAT|O_RDWR,S_IRWXU);
//文件不存在就创建它,使文件具有读写执行的权利int n;
char buf[1024];
while((n=read(file1,buf,1024))>0) //读取file1的前1024个字符到buf里
write(file3,buf,n);
lseek(file3,30,SEEK_END); //在file3后面文件长度加30个字节,形成空洞
while((n=read(file2,buf,1024))>0)
write(file3,buf,n);
close(file1);
close(file2);
close(file3);
printf("FINISH\n");
return 0;
}
第二题
#include<sys/stat.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
int main(int argc,char * argv[])
{
struct stat state;
stat(argv[1],&state); //把argv[1]的信息放在state所指的结构里printf("文件大小=%ld字节\n",state.st_size);
printf("索引节点号=%ld\n",state.st_ino);
printf("最近一次改变状态改变的时间=%ld\n",state.st_ctime);
link(argv[1],argv[2]); //对一个已经存在的文件创建新的硬链接stat(argv[2],&state);
printf("文件大小=%ld字节\n",state.st_size);
printf("索引节点号=%ld\n",state.st_ino);
printf("最近一次改变状态改变的时间=%ld\n",state.st_ctime);
unlink(argv[1]);
printf("FINISH\n");
return 0;
}
第三题
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc,char * argv[])
{
struct stat duf1,duf2;
link(argv[1],argv[2]);
symlink(argv[1],argv[3]);
stat(argv[2],&duf1);
stat(argv[3],&duf2); //如果文件是符号链接,lstat返回的是符号链接本身的信息,stat 返回的是符号链接所指文件的信息
printf("执行stat后:\n");
printf("硬链接文件大小=%ld字节\n",duf1.st_size);
printf("符号链接文件大小=%ld字节\n",duf2.st_size);
printf("硬链接文件索引节点号=%ld\n",duf1.st_ino);
printf("符号链接文件索引节点号=%ld\n",duf2.st_ino);
printf("硬链接文件所在设备号=%ld\n",duf1.st_dev);
printf("符号链接文件所在设备号=%ld\n",duf2.st_dev);
printf("硬链接文件最近一次修改时间=%ld\n",duf1.st_mtime);
printf("符号链接文件最近一次修改时间=%ld\n",duf2.st_mtime);
lstat(argv[2],&duf1);
lstat(argv[3],&duf2);
printf("执行lstat后:\n");
printf("硬链接文件大小=%ld字节\n",duf1.st_size);
printf("符号链接文件大小=%ld字节\n",duf2.st_size);
printf("硬链接文件索引节点号=%ld\n",duf1.st_ino);
printf("符号链接文件索引节点号=%ld\n",duf2.st_ino);
printf("硬链接文件所在设备号=%ld\n",duf1.st_dev);
printf("符号链接文件所在设备号=%ld\n",duf2.st_dev);
printf("硬链接文件最近一次修改时间=%ld\n",duf1.st_mtime);
printf("符号链接文件最近一次修改时间=%ld\n",duf2.st_mtime);
return 0;
}
四.实验总结
通过这次实验,使得我对Linux脚本编写以及调试有了更深的理解,学会了在Linux环境下编写简单的C程序,实现了copy命令,编程实现了renam命令,在理解stat结构内容的基础下分别使用stat()和lstat()系统调用显示文件信息结构的内容,对于在Linux环境下实现C语言的程序实现有了进一步的掌握,使得对以后的学习有了进一步的帮助。