Linux系统cp命令实现
更新时间:2023-05-19 16:43:01 阅读量: 实用文档 文档下载
cp,Linux,实验,read,fread,操作系统,源码,Linux系统cp命令实现
计算机操作系统练习一:实现cp命令
练习要求
实现:Linux的cp 命令,完成文件的拷贝。基本思路是打开源文件,并创建目标文件;然后从源文件中读取数据并写入到目标文件中。 1、用read & write 实现 设置缓存为1B和8192B
分别记录两种缓存方式去拷贝一指定文件(大于1MB)所需要的时间,并分析为什么会有区别。
2、 用fread & fwrite 实现
设定缓存为8192B,记录拷贝指定文件所需要的时间,并与用read & write实现程序(缓存为8192B)进行比较,分析为什么会有区别。
实现环境
VMware 8.0.2虚拟机里面的CentOS 版Linux系统,为该虚拟机分配内存1GB,分配硬盘20GB
实现代码
1、cpbyreadwrite.c
#include<stdio.h> #include<malloc.h> #include<string.h> #include"timing.h"
//#define BUFSIZE 1 #define BUFSIZE 8192
//通过设置BUFSIZE的大小来设置缓存大小 int main(int argc,char *argv[]) {
struct timeval start;
gettimeofday(&start,NULL); if(argc<3)//如果输入不合法 {
printf("Please input right words!\n"); return 1;
}
char buf[BUFSIZE];
cp,Linux,实验,read,fread,操作系统,源码,Linux系统cp命令实现
char *target=(char*)malloc(strlen(argv[1])+strlen(argv[2])+2);//目标目录连接文件名 int i,j,sizeargv2=strlen(argv[2]); for(i=0;i<sizeargv2;++i) target[i]=argv[2][i]; if(target[i-1]!='/') { target[i]='/'; ++i;
}
for(j=0;j<strlen(argv[1]);++j,++i) { target[i]=argv[1][j]; }
target[i]='\0';
int fp=open(argv[1],0); if(fp==-1) { printf("The source file %s is not exist!\n",argv[1]); return 1;
}
int td=creat(target,1); if(td==-1) { printf("Error!The target file can't be creat!\n");
return 1;
}
int n=-1;
while((n=read(fp,buf,BUFSIZE))>0)//复制 { write(td,buf,n);
}
close(fp); close(td);
printf("Copy cost time:%ld microseconds.\n",usdiff(start)); return 0;
}
2、cpbyfreadfwrite.c
#include<stdio.h> #include<malloc.h> #include<string.h> #include"timing.h"
cp,Linux,实验,read,fread,操作系统,源码,Linux系统cp命令实现
#define BUFSIZE 8192
int main(int argc,char *argv[]) { struct timeval start; gettimeofday(&start,NULL); if(argc<3) { printf("Please input right parameters!\n"); return 1;
}
FILE *sfp,*tfp; sfp=fopen(argv[1],"rb"); if(sfp==NULL) { printf("The source %s is not exist!\n",argv[1]);
return 1;
}
char *target=(char*)malloc(strlen(argv[1])+strlen(argv[2])+2); //目标目录连接文件名 int i,j;
for(i=0,j=0;i<strlen(argv[2]);++j,++i) target[i]=argv[2][j]; if(target[i-1]!='/') { target[i]='/';
++i;
}
for(j=0;j<strlen(argv[1]);++i,++j) target[i]=argv[1][j]; target[i]='\0';
tfp=fopen(target,"wb"); if(tfp==NULL) { printf("Can't creat the target file!\n");
return 1;
}
int n=-1;
char buf[BUFSIZE];
while((n=fread(buf,1,BUFSIZE,sfp))>0)//复制
fwrite(buf,n,1,tfp); fclose(sfp); fclose(tfp);
printf("Copy cost time:%ld microseconds.\n",usdiff(start));
return 0;
cp,Linux,实验,read,fread,操作系统,源码,Linux系统cp命令实现
}
结果测试及分析
1、 用read & write 实现,设置缓存为1B和8192B分别复制大小约1.5M的Effective.STL.pdf
和3.8M的LinuxOrder.pdf两个文件从当前目录(/home/lxb/Desktop/cprogram)到/home/lxb/Desktop结果如下。 缓存为1B测试结果:
缓存8192B测试结果:
分析:由图可以看出,当使用8192B缓存的cp方法复制同样文件相较于1B缓存时要节约很
多时间。
由于read,write是非缓冲文件系统的读写,因此每次读写都要重新打开文件操作,设置缓存为1B时候,每次只能从文件中读写1B的内容,因此要打开文件很多次;而设
cp,Linux,实验,read,fread,操作系统,源码,Linux系统cp命令实现
置缓存为8192B时,大大减少了打开文件的次数。所以当使用cp方法来复制同一文件时候,8192B的缓存较1B缓存大大减少了打开读取文件的次数,因此所花时间减少很多,大约相差一千倍。
2、 用fread & fwrite 实现,设定缓存为8192B,与用read & write实现程序(缓存为
8192B)进行比较复制40M的daydayup.avi、1.5M的Effective.STL.pdf及99M的Primer.pdf从当前目录(/home/lxb/Desktop/cprogram)到/home/lxb/Desktop。 read&write实现,缓存8192B测试结果:
fread&fwrite实现,缓存8192B测试结果:
分析:由表中数据可以看出,在复制同样的文件时,采用fread&fwrite实现的cp方法明显
比采用read&write实现cp的方法用时要少很多。
read&write是非缓冲文件系统的读写,而fread&fwrite是缓冲文件下的读写。当
cp,Linux,实验,read,fread,操作系统,源码,Linux系统cp命令实现
read&write方法读取文件时,可能要打开很多次文件,每次都从文件中直接读取数据和将数据直接写到文件;而fread&fwrite方法读取文件时基本上只打开一次文件,将文件中的数据缓冲到内存或将内存中数据一次写入文件,fread&fwrite相当于是到内存去读取数据。所以,在复制一个较大文件时,采用fread&fwrite方法节约了打开和操作文件的次数,从而打打减少了复制文件的时间。
正在阅读:
Linux系统cp命令实现05-19
八年级数学下册第十九章一次函数单元综合检测题(新版)新人教版06-27
公司年度工作报告03-08
食品安全质量管理手册(qs认证版本)实用手册 - 图文07-10
观世音菩萨普门品(拼音版)10-27
最全了不起的狐狸爸爸阅读测试题复习课程04-07
新概念英语第四册课文word版08-29
九工区桥梁吊篮、检查梯施工作业指导书03-30
了不起的狐狸爸爸阅读推进题06-20
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 命令
- 实现
- 系统
- Linux
- 全国人大副委员长、中国科协主席韩启德等领导视察陕西科技馆
- 智能小区的物联网应用解决方案
- 八年级生物下课程纲要
- 2016年下半年新疆安全工程师安全生产法:安全技术措施专项费用模拟试题
- 高一上数学12月份月考试题及答案
- 2020年校园植树节活动总结范文
- 紧急避孕药中左炔诺孕酮对斑马鱼卵巢的影响
- 第十一章 建设有中国特色社会主义的依靠力量和领导
- 浅谈油田地面工程造价的确控
- 历年国税系统公务员面试真题集锦
- 抹灰,扫白,批荡,刮腻子,乳胶漆涂面
- “十三五”重点项目-饲用γ-生育酚项目商业计划书
- 地球和地图单元检测题
- 电力安装工程质量验收规范复习题
- 电波主要传播方式
- 《操作系统实验》课程设计教学大纲201112
- 刊中报:职工年工作日调整为250天
- 进出洁净区更衣规程
- 从业人员健康管理制度和培训管理制度
- 国美企业文化-南京12.6