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方法节约了打开和操作文件的次数,从而打打减少了复制文件的时间。

本文来源:https://www.bwwdw.com/article/lyq4.html

Top