照着书上写,然后在ubuntu系统里面验证,发现copy出来的文件要大于原文件。
/*
* cp1.c - version 1 of cp - users read and write with tunable buffer size
*
* usage: cp1 src dest
*
* */
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#define BUFFERSIZE 1
#define COPYMODE 0664
void oops(char *, char *);
int main(int ac, char *av[]){
int in_fd, out_fd, n_chars;
char buf[BUFFERSIZE];
if(ac!=3){
fprintf(stderr, "usage: %s source destination\n", *av);
exit(1);
}
if( (in_fd = open(av[1], O_RDONLY)) == -1)
oops("Can't open " ,av[1]);
if (( out_fd = creat(av[2], COPYMODE)) == -1)
oops("Can't create " ,av[2]);
fflush(stdin);
fflush(stdout); //自己加的,怀疑缓冲区没有出清
while( (n_chars = read(in_fd, buf, BUFFERSIZE)) > 0)
if( write(out_fd, buf, BUFFERSIZE)!=n_chars)
oops("Write error to ", av[2]);
if(n_chars == -1)
oops("Read error from ", av[1]);
if(close(in_fd) == -1 || close(out_fd) == -1)
oops("Error closing files","");
return 0;
}
void oops(char *s1, char *s2){
fprintf(stderr, "Error: %s \n", s1);
perror(s2);
exit(1);
}
书中给的buffersize是4096,然后测试原文件只有1k这样,然后拷贝出来的文件都是4096。
一开始以为缓冲区没有出清,就加了fflush,还是不行。
后来就把buffersize减少到1024