1> 使用两个进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,并且父进程要阻塞回收子进程资源
//使用两个进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,并且父进程要阻塞回收子进程资源
#include <myhead.h>
int main(int argc, const char *argv[])
{
//定义两个文件描述符
int srcfd,destfd;
if((srcfd=open("./01copy.c",O_RDONLY))==-1)
{
perror("open srcfile error");
return -1;
}
//以写的方式打开目标文件
if((destfd=open("./copy.c",O_WRONLY|O_CREAT|O_TRUNC,0776))==-1)
{
perror("open destfile error");
return -1;
}
//求出文件大小,方便划分前半,后半
int size=lseek(srcfd,0,SEEK_END);
//定义搬运工
char buf[128];
pid_t pid=fork(); //创建子进程
if(pid > 0) //判断如果是父进程
{
sleep(8);
//重新定位光标,把光标定在源文件开始
lseek(srcfd,0,SEEK_SET);
//把光标定义在拷贝文件的开始
lseek(destfd,0,SEEK_SET);
//开始循环拷贝
for(int i=0;i<size/2;i++)
{
int ret=read(srcfd,buf,sizeof(buf));
write(destfd,buf,ret);
}
printf("父进程拷贝前一半内容成功\n");
//父进程阻塞回收子进程资源
wait(NULL);
waitpid(pid,NULL,WNOHANG);
// _exit(EXIT_SUCCESS);
}else if(pid==0)
{
sleep(4);
//再次重新定位光标
//lseek(srcfd,size/2,SEEK_SET);
//lseek(destfd,size/2,SEEK_SET);
for(int j=size/2;j<=size;j++)
{
int ret=read(srcfd,buf,sizeof(buf));
write(destfd,buf,ret);
}
printf("子进程拷贝后一半内容成功\n");
_exit(EXIT_SUCCESS); //退出程序,不刷新缓冲区
} //如果不退出一个程序,会出现文件拷贝成功x2
//父程序或者子程序任选一个退出,两个都退出,不出现文件拷贝成功
close(srcfd);
close(destfd);
printf("文件拷贝成功\n");
return 0;
}
2> 使用三个进程完成两个文件的拷贝,父进程拷贝前三分之一,子进程1拷贝中间三分之一,子进程2拷贝后三分之一,父进程要阻塞回收所有子进程资源
//2>使用三个进程完成两个文件的拷贝,父进程拷贝前三分之一,子进程1拷贝中间三分之一,子进程2拷贝后三分之一,父进程要阻塞回收所有子进程资源
#include <myhead.h>
int main(int argc, const char *argv[])
{
//定义两个文件描述符
int srcfd,destfd;
if((srcfd=open("./picture.png",O_RDONLY))==-1)
{
perror("open srcfile error");
return-1;
}
if((destfd=open("./copy.png",O_WRONLY|O_CREAT|O_TRUNC,0776))==-1)
{
perror("open destfile error");
return -1;
}
//求文件大小
int size=lseek(srcfd,0,SEEK_END);
//搬运工
char buf[128]="";
//创建子进程1
pid_t pid1=fork();
if(pid1<0)
{
perror("fork error");
return -1;
}
else if(pid1==0)
{
//sleep(1);子进程1
lseek(srcfd,2*size/3,SEEK_SET);
lseek(destfd,2*size/3,SEEK_SET);
for(int i=2*size/3;i<=size;i++)
{
int ret=read(srcfd,buf,sizeof(buf));
write(destfd,buf,ret);
}
printf("文件后1/3拷贝成功\n");
_exit(EXIT_SUCCESS);
}
else
{
//创建子进程2
pid_t pid2=fork();
if(pid2<0)
{
perror("fork error");
return -1;
}else if(pid2==0)
{
sleep(4);
//重新定位光标
lseek(srcfd,size/3,SEEK_SET);
lseek(destfd,size/3,SEEK_SET);
for(int i=size/3;i<2*size/3;i++)
{
int ret=read(srcfd,buf,sizeof(buf));
write(destfd,buf,ret);
}
printf("文件中间1/3拷贝成功\n");
_exit(EXIT_SUCCESS);
}
else
{
lseek(srcfd,0,SEEK_SET);
lseek(destfd,0,SEEK_SET);
//父进程
sleep(5);
for(int i=0;i<size/3;i++)
{
int ret=read(srcfd,buf,sizeof(buf));
write(destfd,buf,ret);
}
printf("文件前1/3拷贝成功\n");
sleep(7);
wait(NULL);
wait(NULL);
}
}
printf("文件全部拷贝成功\n");
return 0;
}