(1) 实例源码file_copy.c
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#define BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
int from_fd; /* 源文件描述符 */
int to_fd; /* 目的文件描述符 */
int bytes_read; /* 读到的字节数 */
int bytes_write; /* 写入的字节数 */
char buffer[BUFFER_SIZE]; /* 写文件时的缓冲区大小 */
char *ptr;
if( argc != 3 )
{
fprintf( stderr,"Usage:%s fromfile tofile\n",argv[0] );
exit(1);
}
/* 打开源文件*/
if( (from_fd = open(argv[1],O_RDONLY)) == -1 )
{
fprintf( stderr,"Open %s Error:%s\n",argv[1],strerror(errno) );
exit(1);
}
/* 打开目的文件,不存在的话就首先创建 */
if( (to_fd = open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)) == -1 )
{
fprintf( stderr,"Open %s Error:%s\n",argv[2],strerror(errno) );
exit(1);
}
/* 经典的文件拷贝 */
while( bytes_read = read( from_fd,buffer,BUFFER_SIZE))
{
if( (bytes_read == -1)&&(errno != EINTR)) /* 一个致命的错误发生了 */
break;
else
if( bytes_read > 0 )
{
ptr = buffer;
while( bytes_write = write( to_fd,ptr,bytes_read ) )
{
if( (bytes_write == -1)&&(errno != EINTR) ) /* 一个致命的错误发生了 */
break;
else
if( bytes_write == bytes_read ) /* 写完了所有独读到的字节 */
break;
else
if(bytes_write > 0) /* 只写了一部分 */
{
ptr += bytes_write;
bytes_read -= bytes_write;
}
}
if(bytes_write == -1)
break;
}
}
close(from_fd);
close(to_fd);
exit(0);
}
(2)调试过程以及结果
①编译
②查看源文件(待拷贝文件)内容
③执行拷贝
④查看目的文件内容