#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#define N 128
char 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;
}
父子进程各拷贝一半文件实现
最新推荐文章于 2023-07-04 10:24:09 发布