两个子进程 copy 文件,每个进程copy一半
#include "head.h"
int main(int argc, const char *argv[])
{
int flag = 0;
off_t size = 0;
char buf;
int fd_r = open("./a.txt", O_RDONLY);
if (fd_r < 0)
{
perror("fd_r error\n");
return -1;
}
int fd_w = open("./b.txt", O_RDWR | O_TRUNC | O_CREAT, 0776);
if (fd_w < 0)
{
perror("fd_w error\n");
return -1;
}
size = lseek(fd_r, 0, SEEK_END);
//创建父子进程
int pid = fork();
if (pid < 0)
{
perror("fork error\n");
return -1;
}
else if (pid > 0)
{
//父进程
int pid_f = fork();
if (pid_f > 0)
{
waitpid(pid, NULL, 0);
waitpid(pid_f, NULL, 0);
}
else if (pid_f == 0)
{
//父:子进程
lseek(fd_r, 0, SEEK_SET);
lseek(fd_w, 0, SEEK_SET);
for (int i = 0; i < size / 2; i++)
{
int ret_r = read(fd_r, &buf, 1);
if (ret_r < 0)
{
perror("read error\n");
return -1;
}
int ret_w = write(fd_w, &buf, 1);
if (ret_w < 0)
{
perror("write error\n");
return -1;
}
}
printf("前半段拷贝完成\n");
}
else if (pid_f < 0)
{
perror("fork_f error\n");
return -1;
}
}
else if (pid == 0)
{
//子进程
sleep(2);
lseek(fd_r, size / 2, SEEK_SET);
lseek(fd_w, size / 2, SEEK_SET);
for (int i = size / 2; i < size; i++)
{
int ret_r = read(fd_r, &buf, 1);
if (ret_r < 0)
{
perror("read error\n");
return -1;
}
int ret_w = write(fd_w, &buf, 1);
if (ret_w < 0)
{
perror("write error\n");
return -1;
}
}
printf("后半段拷贝完成\n");
}
close(fd_r);
close(fd_w);
return 0;
}