本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Linux下cp命令的代码实现
cp命令的实现思路:
1.打开原文件
2.将原文件读取到缓存中
3.打开(如果文件不存在则创建文件)目标文件
4.将缓存中的内容写入到目标文件中
5.关闭原文件与目标文件
代码实现如下:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
int main(int argc,char **argv)
{
int fdSrc;
int fdDes;
char *readBuf=NULL;
if(argc!=3){
printf("参数传递错误\n");
exit(-1);
}
fdSrc=open(argv[1],O_RDWR);
int size=lseek(fdSrc,0,SEEK_END);
lseek(fdSrc,0,SEEK_SET);
readBuf=(char *)malloc(sizeof(char)*size+8);
int n_read=read(fdSrc,readBuf,1024);
fdDes=open(argv[2],O_RDWR|O_CREAT,0600);
int n_write=write(fdDes,readBuf,strlen(readBuf));
close(fdSrc);
close(fdDes);
return 0;
}
总结:
通过lseek函数移动光标计算字节长度,为了避免内存浪费,动态申请内存空间。
这里有个隐藏bug,将在下边解决。
Linux下cp命令的代码实现(二)
上边说到代码有bug,那么bug在哪呢?细心的读者会发现,我在读取的时候传了固定的参数,也就是1024,只能读取1MB的内容,如果文件超出1MB,后边的内容就会拷贝不到,而上边也计算了文件的长度或大小,用size保存了,所以第一个bug解决方案便是将1024改为size。
第二个bug是如果文件存在并且有内容的话,再次打开如果没有用O_TRUNC 的话,内容不清空,再次拷贝,之前的内容会存在,和最终要拷贝的内容不一致,解决方案是增加上O_TRUNC 将存在的文件中的内容情况,然后进行拷贝,从而实现cp的效果。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
int main(int argc,char **argv)
{
int fdSrc;
int fdDes;
char *readBuf=NULL;
if(argc!=3){
printf("参数传递错误\n");
exit(-1);
}
fdSrc=open(argv[1],O_RDWR);
int size=lseek(fdSrc,0,SEEK_END);
lseek(fdSrc,0,SEEK_SET);
readBuf=(char *)malloc(sizeof(char)*size+8);
//int n_read=read(fdSrc,readBuf,1024);
int n_read=read(fdSrc,readBuf,size);
//fdDes=open(argv[2],O_RDWR|O_CREAT,0600);
fdDes=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
int n_write=write(fdDes,readBuf,strlen(readBuf));
close(fdSrc);
close(fdDes);
return 0;
}
这样,cp命令就简单的实现了。