1、作业要求
要求拷贝一张图片,子进程先拷贝后半部分,父进程再拷贝前半部分;
2、实现过程
#include<stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
int main(int argc, const char *argv[])
{
//创建一个子进程
pid_t pid = fork();
//打开源文件
int fd_r = open("./1.png",O_RDONLY);
if(fd_r<0){
perror("open");
return -1;
}
//求源文件大小
off_t size_r = lseek(fd_r,0,SEEK_END);
off_t flag;
if(size_r%2 == 0){
flag = size_r/2; //如果源文件大小为偶数,从中间开始偏移
}
else{
flag = size_r/2+1; //如果源文件大小为奇数,从中间+1的位置开始偏移
}
//打开目标文件
int fd_w =open("./2.png",O_WRONLY|O_CREAT|O_TRUNC,0744);
if(fd_w<0){
perror("open");
return -1;
}
char c = 0;
size_t res1 = 0;
size_t res2 = 0;
//拷贝前半部分
if(pid > 0){
sleep(1);
lseek(fd_r,0,SEEK_SET); //偏移量从源文件开头开始
lseek(fd_w,0,SEEK_SET); //偏移量从目标文件开头开始
for(int i=0;i<size_r/2;i++){
res1 = read(fd_r,&c,1);
if(res1<0){
perror("read");
return -1;
}
res2 = write(fd_w,&c,res1);
if(res2<0){
perror("write");
return -1;
}
}
printf("前半部分拷贝完毕\n");
}
//拷贝后半部分
else if(pid == 0){
lseek(fd_r,size_r/2,SEEK_SET); //偏移量从源文件的中间开始
lseek(fd_w,size_r/2,SEEK_SET); //偏移量从目标文件的中间开始
for(int i=0;i<flag;i++){
res1 = read(fd_r,&c,1);
if(res1<0){
perror("read");
return -1;
}
res2 = write(fd_w,&c,res1);
if(res2<0){
perror("write");
return -1;
}
}
printf("后半部分拷贝完毕\n");
}
else{
perror("fork");
return -1;
}
//关闭文件
if(close(fd_r)<0){
perror("close");
return -1;
}
if(close(fd_w)<0){
perror("close");
return -1;
}
return 0;
}
3、实现效果