linux下一个简单的文件复制程序,cp命令的实现,
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int fd_read;
int fd_write;
char buf[128]={0};
int bytes_read,bytes_write;
if(argc < 3)
{
printf("Usage:write_test FILEREAD FILEWRITE\n");
return -1;
}
fd_read=open(argv[1],O_RDONLY);
if(fd_read == -1)
{
perror("open error\n");
return -2;
}
fd_write=open(argv[2],O_CREAT|O_WRONLY|O_TRUNC,0640);
if(fd_write == -1)
{
perror("open error\n");
close(fd_read);
return -3;
}
while(bytes_read=read(fd_read,buf,sizeof(buf)-1))
{
if(bytes_read > 0)
{
bytes_write=write(fd_write,buf,bytes_read);
memset(buf,0,sizeof(buf));
if(bytes_write == -1)
break;
}
else if((bytes_read == -1)&&(errno != EINTR))
{
break;
}
}
close(fd_read);
close(fd_write);
return 0;
}
这段代码实现了文件的复制,但是并不完善,我们应当检查已经写入的数据是否等于要等待写入的数据,
那么我们增加一个write_buffer函数,来确保所有的数据都能完整写入文件:
int write_buffer(int fd,const void *buf,size_t count)
{
int n=0,r=count;
while(count > 0)
{
n=write(fd,buf,count);
if(n == 0)
{
r=0;
break;
}
if(n > 0)
{
count-=n;
buf+=n;
}
else if(n < 0)
{
if(error == EINTR)
continue;
r=-1;
break;
}
}
return r;
}
上面代码中把write()替换为write_buffer();
这样就是一段经典的复制代码了。