子进程先拷贝一张图片后半部分,父进程后拷贝后半部分
代码实现如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
//打开文件
int fd, fd1;
fd = open(argv[1],O_RDONLY);
if(fd < 0)
{
perror("open");
return -1;
}
fd1 = open("copy.png",O_WRONLY|O_CREAT|O_TRUNC, 0664);
if(fd1 < 0)
{
perror("open");
return -1;
}
//文件大小
off_t size = lseek(fd,0,SEEK_END);
//判断文件大小的奇偶性
int flag = size%2 == 0 ? 0:1;
pid_t pid = fork();
if(pid > 0)
{
//父进程执行
sleep(1); //父进程先休眠1秒,使子进程先完成拷贝
lseek(fd,0,SEEK_SET);
lseek(fd1,0,SEEK_SET);
char c = 0;
for(int i = 0; i < size/2; i++)
{
if(read(fd, &c, 1) < 0)
{
perror("read");
return -1;
}
if(write(fd1, &c, 1) < 0)
{
perror("write");
return -1;
}
}
printf("文件前半部分拷贝完毕\n");
}
else if(0 == pid)
{
//子进程执行
lseek(fd,size/2,SEEK_SET);
lseek(fd1,size/2,SEEK_SET);
char c = 0;
for(int i = 0; i < size/2+flag; i++)
{
if(read(fd, &c, 1) < 0)
{
perror("read");
return -1;
}
if(write(fd1, &c, 1) < 0)
{
perror("write");
return -1;
}
}
printf("文件后半部分拷贝完毕\n");
}
//关闭文件
close(fd);
close(fd1);
return 0;
}
运行结果如下:
ubuntu@ubuntu:copy$ gcc copy.c
ubuntu@ubuntu:copy$ ./a.out png.png
文件后半部分拷贝完毕
文件前半部分拷贝完毕
ubuntu@ubuntu:copy$ diff png.png copy.png
ubuntu@ubuntu:copy$