需求:
利用父子进程拷贝一张图片,要求子进程先拷贝后半部分,再父进程拷贝前半部分
代码实现过程:
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define MSG_ERR(msg){\
fprintf(stderr,"line : %d",__LINE__);\
perror("msg");\
}
int main(int argc, const char *argv[])
{
/*
int a = 10;
printf("line%d : %d\n",__LINE__,a);
pid_t pid = fork();
if(pid==0){
printf("line%d : %d\n",__LINE__,a);
}
else{
a = 4;
printf("line%d : %d\n",__LINE__,a);
}
printf("line%d : %d\n",__LINE__,a);
*/
int fd = open("./1.png",O_RDONLY);
int fd1 = open("./copy.png",O_RDWR|O_CREAT ,0664);
if( fd < 0 || fd1 < 0 ){
MSG_ERR(open);
return -1;
}
struct stat buf;
if(stat("./1.png",&buf)<0){
MSG_ERR(stat);
return -1;
}
char str[32]="";
ssize_t size = buf.st_size/2;
ssize_t read_size = 0;
//判断奇偶性
int flag = size % 2;
ssize_t res = 0;
long int cnt = 0;
pid_t pid = fork();
if(pid==0){
lseek(fd,size,SEEK_SET);
lseek(fd1,size,SEEK_SET);
while(1){
res = read(fd,str,sizeof(str));
if(res < 0){
MSG_ERR(read);
}
else if(res==0){
break;
}
if(write(fd1,str,res) < 0){
MSG_ERR(write);
}
}
printf("后半部分\n");
}
else if(pid > 0){
sleep(1);
lseek(fd,0,SEEK_SET);
lseek(fd1,0,SEEK_SET);
//res = 0;
while(1){
read_size = size/sizeof(str) == 0?size:sizeof(str);
res = read(fd,str,read_size);
if(res < 0){
MSG_ERR(read);
}
if(write(fd1,str,res) < 0){
MSG_ERR(write);
}
if((size-=read_size)==0){
break;
}
}
printf("前半部分\n");
}
else if(pid < 0){
MSG_ERR(fork);
return -1;
}
close(fd);
close(fd1);
return 0;
}
代码实现结果: