父子进程各拷贝一半文件实现

#include #include #include #include #include #include #define N 128char buf[N] = { 0 }; int main(int argc, char const *argv[]) { pid_t pid; int r_fd,w_fd,size,ret; char ch = '\0'; r_fd = open(argv[1], O_RDONLY); if(r_fd < 0) { perror("open read_file"); exit(-1); } w_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644); if(w_fd < 0) { perror("open write_file"); exit(-1); }//get src file total size size = lseek(r_fd, 0, SEEK_END); if(size < 0) { perror("lseek"); exit(-1); }//fill dst file lseek(w_fd, size-1, SEEK_SET); if(write(w_fd, &ch, 1) < 0) { perror("write"); exit(-1); } size /= 2; close(r_fd); close(w_fd); pid = fork(); if(pid < 0) { perror("fork"); exit(-1); } //child copy before 1/2 else if(0 == pid) { //child process r_fd = open(argv[1], O_RDONLY); if(r_fd < 0) { perror("open read_file"); exit(-1); }w_fd = open(argv[2], O_WRONLY); if(w_fd < 0) { perror("open write_file"); exit(-1); }//copy from head,copy 1/2 lseek(r_fd,size,SEEK_SET); lseek(w_fd,size,SEEK_SET); while((ret = read(r_fd, buf, N)) > 0) { write(w_fd, buf, ret); }close(r_fd); close(w_fd); } else { //parent process r_fd = open(argv[1], O_RDONLY); if(r_fd < 0) { perror("open read_file"); exit(-1); }w_fd = open(argv[2], O_WRONLY); if(w_fd < 0) { perror("open write_file"); exit(-1); }//copy after 1/2 while(size > 0) { if(size > N) { write(w_fd, buf, read(r_fd, buf, N)); size -= N; } else { write(w_fd, buf, read(r_fd, buf, size)); break; } }close(r_fd); close(w_fd); } return 0; }

    推荐阅读