1、使用两个进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,并且父进程要阻塞回收子进程资源
#include<myhead.h>
void my_copy(int srcfp,int dstfp,int n)
{
int sum=lseek(srcfp,0,SEEK_END); //文件大小
sum=sum/2; //要拷贝的字节数
char buf[256]=""; //定义缓冲区搬运字符
int ret=0;
lseek(srcfp,n,SEEK_SET);
while((ret=read(srcfp,buf,sizeof(buf)))>0&&sum>0) //开始拷贝
{
if(ret>sum)
{
ret=sum;
}
sum-=ret;
write(dstfp,buf,ret);
}
}
int main(int argc, const char *argv[])
{
if(argc!=3)
{
printf("usage:./a.out srcfile dstfile\n");
return -1;
}
//打开文件
int srcfp,dstfp;
if((srcfp=open(argv[1],O_RDONLY))==-1)
{
perror("open srcfile error");
return -1;
}
if((dstfp=open(argv[2],O_RDWR|O_CREAT|O_APPEND,0664))==-1)
{
perror("open dstfile error");
return -1;
}
pid_t pid;
pid=fork(); //创建子进程
if(pid<0)
{
perror("fork error");
return -1;
}else if(pid ==0)
{
int sum=lseek(srcfp,0,SEEK_END);
sum=sum/2;
my_copy(srcfp,dstfp,sum);
printf("拷贝成功1\n");
printf("子进程\n");
exit(EXIT_SUCCESS);
}else
{
my_copy(srcfp,dstfp,0);
printf("父进程\n");
wait(NULL);
printf("拷贝成功2\n");
}
close(srcfp);
close(dstfp);
return 0;
}
2、使用三个进程完成两个文件的拷贝,父进程拷贝前三分之一,子进程1拷贝中间三分之一,子进程2拷贝后三分之一,父进程要阻塞回收所有子进程资源
#include<myhead.h>
void my_copy(int srcfp,int dstfp,int n)
{
int sum=lseek(srcfp,0,SEEK_END); //文件大小
sum=sum/3; //要拷贝的字节数
char buf[256]=""; //定义缓冲区搬运字符
int ret=0;
lseek(srcfp,n,SEEK_SET);
while((ret=read(srcfp,buf,sizeof(buf)))>0&&sum>0) //开始拷贝
{
if(ret>sum)
{
ret=sum;
}
sum-=ret;
write(dstfp,buf,ret);
}
}
int main(int argc, const char *argv[])
{
if(argc!=3)
{
printf("usage:./a.out srcfile dstfile\n");
return -1;
}
//打开文件
int srcfp,dstfp;
if((srcfp=open(argv[1],O_RDONLY))==-1)
{
perror("open srcfile error");
return -1;
}
if((dstfp=open(argv[2],O_RDWR|O_CREAT|O_APPEND,0664))==-1)
{
perror("open dstfile error");
return -1;
}
int sum=lseek(srcfp,0,SEEK_END);
pid_t pid;
pid=fork(); //创建子进程
if(pid<0)
{
perror("fork error");
return -1;
}else if(pid==0) //子进程1
{
sum=sum/3;
my_copy(srcfp,dstfp,sum);
printf("子进程1\n");
exit(EXIT_SUCCESS);
}else if(pid>0)
{
pid_t pid1=fork();
if(pid1<0)
{
perror("fork error");
return -1;
}else if(pid1==0) //子进程2
{
sleep(1);
sum=sum*2/3;
my_copy(srcfp,dstfp,sum);
printf("子进程2\n");
exit(EXIT_SUCCESS);
}else //父进程
{
my_copy(srcfp,dstfp,0);
wait(NULL);
wait(NULL);
}
}
return 0;
}