#include <stdio.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 fd_src,fd_dest,ret;
char buf_src[128];
fd_src=open(argv[1],O_RDONLY);
if(fd_src<0){
printf("open file error!!\n");
return fd_src;
}
fd_dest=open(argv[2],O_RDWR|O_TRUNC|O_CREAT,0777);
if(fd_dest<0){
printf("open file error!!\n");
return fd_dest;
}
bzero(buf_src,128);
while((ret=read(fd_src,buf_src,128))>0){
write(fd_dest,buf_src,ret);
bzero(buf_src,128);
}
close(fd_dest);
close(fd_src);
return 0;
}
用系统函数read和write写cp命令其实很简单,上边就是我之前写的,也能实现cp的功能,可是有个问题我没有注意到,在用write函数时,我定义的写入个数是ret(read函数的返回值),在这里我想当然了,write不一定真的写了ret个,有可能没有写这么多,这么用写的东西少时可能没问题,可多了就会有bug的。所以还需要改善,下面就是改善后的完整code(我把main()和cp()分开了):
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
void cp(int fd_src,int fd_dest)
{
int sret,dret;
char buf_src[128];
char *p;
bzero(buf_src,128);
while((sret=read(fd_src,buf_src,128))>0){
p=buf_src;
while(sret){
dret=write(fd_dest,p,sret);
sret=sret-dret;
p=p+dret;
}
}
}
int main(int argc,char *argv[])
{
int fd_src,fd_dest;
fd_src=open(argv[1],O_RDONLY);
if(fd_src<0){
printf("open file error!!\n");
return fd_src;
}
fd_dest=open(argv[2],O_RDWR|O_CREAT,0777);
if(fd_dest<0){
printf("open file error!!\n");
return fd_dest;
}
cp(fd_src,fd_dest);
close(fd_dest);
close(fd_src);
return 0;
}