代码如下:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, const char *argv[])
{
//打开个文件读的方式
int fd =open(argv[1],O_RDONLY);
if(fd<0)
{
perror("open");
return -1;
}
//打开一个文件写的方式
int fd1=open("2.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) //让父进程拷贝后半部分,先休眠
{
char c=0;
sleep(2);
lseek(fd,0,SEEK_SET);
lseek(fd1,0,SEEK_SET);
for(int i=0;i<size/2;i++)
{
if(read(fd,&c,1)<0)
{
perror("read");
return -1;
}
write(fd1,&c,1);
}
printf("前半部分拷贝完成\n");
}
else if(pid==0) //子进程拷贝前半部分
{
char c=0;
lseek(fd,size/2,SEEK_SET);
lseek(fd1,size/2,SEEK_SET);
for(int i=0;i<size/2+flag;i++)
{
if(read(fd,&c,1)<0)
{
perror("read");
return-1;
}
write(fd1,&c,1);
}
printf("后半部分拷贝完成\n");
}
//关闭文件
if(close(fd)<0)
{
perror("close");
return -1;
}
if(close(fd1)<0)
{
perror("close");
return -1;
}
/* printf("main 函数准备运行\n") ;
int a=10;
//创建子进程
pid_t pid=fork();
printf("pid=%d a=%d %p__%d__\n",pid,a,&a,__LINE__);
if(pid!=0)
{
a=4;
}
printf("pid=%d a=%d %p__%d__\n",pid,a,&a,__LINE__);
while(1)
{
sleep(1);
}*/
return 0;
}
实现结果:
ubuntu@ubuntu:20221208$ gcc taxt.c
ubuntu@ubuntu:20221208$ ./a.out 1.png
后半部分拷贝完成
前半部分拷贝完成
ubuntu@ubuntu:20221208$ diff 1.png 2.png
ubuntu@ubuntu:20221208$ ls -l
总用量 320
-rw-rw-r-- 1 ubuntu ubuntu 149676 十二 8 20:22 1.png
-rw-rw-r-- 1 ubuntu ubuntu 149676 十二 8 20:40 2.png
-rwxrwxr-x 1 ubuntu ubuntu 12792 十二 8 20:40 a.out
-rw-rw-r-- 1 ubuntu ubuntu 746 十二 8 13:39 opendir.c
-rw-rw-r-- 1 ubuntu ubuntu 1510 十二 8 20:39 taxt.c
ubuntu@ubuntu:20221208$