用文件IO拷贝一张图片,要求子进程拷贝后半部分,父进程拷贝前半部分。不允许使用sleep(1)函数。
说明,父子进程不会相互干扰,即系统文件表不使用同一张即可。---->说明父进程开一次文件,子进程自己开一次文件
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
//删除hcc_1.jpg的文件,防止上次写入的内容影响当前的写入
remove("hcc_2.jpg");
//创建子进程
pid_t pid=fork();
//打开源文件
int fd_r=open("./hcc_1.jpg",O_RDONLY);
if(fd_r<0){
perror("open");
return -1;
}
//打开目标文件
int fd_w=open("hcc_2.jpg",O_WRONLY|O_CREAT,0664);
if(fd_w<0){
perror("open");
return -1;
}
//计算源文件大小
off_t size=lseek(fd_r,0,SEEK_END);
printf("size=%ld\n",size);
if(pid>0){
//父进程执行,拷贝前部分,所以要偏移到开头位置
lseek(fd_r,0,SEEK_SET);
lseek(fd_w,0,SEEK_SET);
char c=0;
int i=0;
for(i=0;i<size/2;i++);{
read(fd_r,&c,1);
write(fd_w,&c,1);
}
printf("文件前部分拷贝完毕\n");
}
else if(0==pid){
//子进程执行,拷贝后半部分,所以要偏移到中间位置
lseek(fd_r,size/2,SEEK_SET);
lseek(fd_w,size/2,SEEK_SET);
char c=0;
int i=0;
for(i=0;i<size/2;i++){
read(fd_r,&c,1);
write(fd_w,&c,1);
}
printf("文件后部分拷贝完毕\n");
}
else if(pid<0){
perror("fork");
return -1;
}
close(fd_r);
close(fd_w);
return 0;
}