您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > Linux系统cp命令实现
计算机操作系统练习一:实现cp命令1计算机操作系统练习一:实现cp命令练习要求实现:Linux的cp命令,完成文件的拷贝。基本思路是打开源文件,并创建目标文件;然后从源文件中读取数据并写入到目标文件中。1、用read&write实现•设置缓存为1B和8192B•分别记录两种缓存方式去拷贝一指定文件(大于1MB)所需要的时间,并分析为什么会有区别。2、用fread&fwrite实现•设定缓存为8192B,记录拷贝指定文件所需要的时间,并与用read&write实现程序(缓存为8192B)进行比较,分析为什么会有区别。实现环境VMware8.0.2虚拟机里面的CentOS版Linux系统,为该虚拟机分配内存1GB,分配硬盘20GB实现代码1、cpbyreadwrite.c#includestdio.h#includemalloc.h#includestring.h#includetiming.h//#defineBUFSIZE1#defineBUFSIZE8192//通过设置BUFSIZE的大小来设置缓存大小intmain(intargc,char*argv[]){structtimevalstart;gettimeofday(&start,NULL);if(argc3)//如果输入不合法{printf(Pleaseinputrightwords!\n);return1;}charbuf[BUFSIZE];计算机操作系统练习一:实现cp命令2char*target=(char*)malloc(strlen(argv[1])+strlen(argv[2])+2);//目标目录连接文件名inti,j,sizeargv2=strlen(argv[2]);for(i=0;isizeargv2;++i)target[i]=argv[2][i];if(target[i-1]!='/'){target[i]='/';++i;}for(j=0;jstrlen(argv[1]);++j,++i){target[i]=argv[1][j];}target[i]='\0';intfp=open(argv[1],0);if(fp==-1){printf(Thesourcefile%sisnotexist!\n,argv[1]);return1;}inttd=creat(target,1);if(td==-1){printf(Error!Thetargetfilecan'tbecreat!\n);return1;}intn=-1;while((n=read(fp,buf,BUFSIZE))0)//复制{write(td,buf,n);}close(fp);close(td);printf(Copycosttime:%ldmicroseconds.\n,usdiff(start));return0;}2、cpbyfreadfwrite.c#includestdio.h#includemalloc.h#includestring.h#includetiming.h计算机操作系统练习一:实现cp命令3#defineBUFSIZE8192intmain(intargc,char*argv[]){structtimevalstart;gettimeofday(&start,NULL);if(argc3){printf(Pleaseinputrightparameters!\n);return1;}FILE*sfp,*tfp;sfp=fopen(argv[1],rb);if(sfp==NULL){printf(Thesource%sisnotexist!\n,argv[1]);return1;}char*target=(char*)malloc(strlen(argv[1])+strlen(argv[2])+2);//目标目录连接文件名inti,j;for(i=0,j=0;istrlen(argv[2]);++j,++i)target[i]=argv[2][j];if(target[i-1]!='/'){target[i]='/';++i;}for(j=0;jstrlen(argv[1]);++i,++j)target[i]=argv[1][j];target[i]='\0';tfp=fopen(target,wb);if(tfp==NULL){printf(Can'tcreatthetargetfile!\n);return1;}intn=-1;charbuf[BUFSIZE];while((n=fread(buf,1,BUFSIZE,sfp))0)//复制fwrite(buf,n,1,tfp);fclose(sfp);fclose(tfp);printf(Copycosttime:%ldmicroseconds.\n,usdiff(start));return0;计算机操作系统练习一:实现cp命令4}结果测试及分析1、用read&write实现,设置缓存为1B和8192B分别复制大小约1.5M的Effective.STL.pdf和3.8M的LinuxOrder.pdf两个文件从当前目录(/home/lxb/Desktop/cprogram)到/home/lxb/Desktop结果如下。缓存为1B测试结果:缓存8192B测试结果:Effective.STL.pdf(1.5M)LinuxOrder.pdf(3.8M)缓存1B用时(微秒)820430317999985缓存8192B用时(微秒)785417408分析:由图可以看出,当使用8192B缓存的cp方法复制同样文件相较于1B缓存时要节约很多时间。由于read,write是非缓冲文件系统的读写,因此每次读写都要重新打开文件操作,设置缓存为1B时候,每次只能从文件中读写1B的内容,因此要打开文件很多次;而设计算机操作系统练习一:实现cp命令5置缓存为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测试结果:daydayup.avi(40M)Effective.STL.pdf(1.5M)Primer.pdf(99M)read&write实现用时(微秒)714309127122724895607fread&fwrite实现用时(微秒)1492623527178305519分析:由表中数据可以看出,在复制同样的文件时,采用fread&fwrite实现的cp方法明显比采用read&write实现cp的方法用时要少很多。read&write是非缓冲文件系统的读写,而fread&fwrite是缓冲文件下的读写。当计算机操作系统练习一:实现cp命令6read&write方法读取文件时,可能要打开很多次文件,每次都从文件中直接读取数据和将数据直接写到文件;而fread&fwrite方法读取文件时基本上只打开一次文件,将文件中的数据缓冲到内存或将内存中数据一次写入文件,fread&fwrite相当于是到内存去读取数据。所以,在复制一个较大文件时,采用fread&fwrite方法节约了打开和操作文件的次数,从而打打减少了复制文件的时间。
本文标题:Linux系统cp命令实现
链接地址:https://www.777doc.com/doc-4902883 .html