用文件IO拷贝一张图片,要求子进程拷贝后半部分,父进程拷贝前半部分。不允许使用sleep(1)函数。
说明,父子进程不会相互干扰,即系统文件表不使用同一张即可。---》说明父进程开一次文件,子进程自己开一次文件。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
int main(int argc, const char *argv[])
{
//创建数组存储读取的数据
char arr[2]="";
//创建子进程
pid_t pid=fork();
if (pid<0)
{
perror("fork");
return -1;
}
//打开需要读取的文件
int fd=open("./pic.jpg",O_RDONLY);
if (fd==-1)
{
perror("open fd");
return -1;
}
//计算要读取文件的大小
off_t len=lseek(fd,0,SEEK_END);
off_t pos=len/2;
//打开将要写入数据的文件
int fd2=open("./cpy.jpg",O_RDWR|O_CREAT|O_TRUNC,0777);
if (fd2==-1)
{
perror("open fd2");
return -1;
}
if (pid==0)
{
//子进程操作
lseek(fd,pos,SEEK_SET);
lseek(fd2,pos,SEEK_SET);
ssize_t num=999; //定义变量接收read返回值
while(num!=0)
{
num=read(fd,arr,1);
write(fd2,arr,num);
}
}
else if(pid>0)
{
//父进程操作
ssize_t num1=999;
lseek(fd,0,SEEK_SET);
lseek(fd2,0,SEEK_SET);
while(lseek(fd2,0,SEEK_CUR)<pos)
{
num1=read(fd,arr,1);
num1=write(fd2,arr,num1);
if (num1<=0)
{
perror("write");
return -1;
}
}
}
close(fd);
close(fd2);
return 0;
}