1、使用两个进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,并且父进程要阻塞回收子进程资源
#include <myhead.h>
int main(int argc, const char *argv[])
{
//输入外部传参个数
if(argc!=3)
{
perror("input error");
perror("./a.out srcfile desfile");
return -1;
}
//定义源文件文件指针
FILE *fp1;
if((fp1=(fopen(argv[1],"r")))==NULL)
{
perror("open srcfile error");
return -1;
}
//定义目标文件文件指针
FILE *fp2;
if((fp2=(fopen(argv[2],"w")))==NULL)
{
perror("open desfile error");
return -1;
}
//求源文件字节总个数
off_t sum=lseek(fp1->_fileno,0,SEEK_END);
lseek(fp1->_fileno,0,SEEK_SET);
off_t now;
pid_t pid;
//创建子进程
pid=fork();
//字符搬运工
char buf;
if(pid < 0)
{
perror("fork error");
return -1;
}
else if(pid > 0) //父进程
{
wait(NULL);
lseek(fp1->_fileno,0,SEEK_SET);
lseek(fp2->_fileno,0,SEEK_SET);
//当光标位置字节数小于等于一半总数
while((now=lseek(fp1->_fileno,0,SEEK_CUR))<=sum/2)
{
if(fread(&buf,1,1,fp1)<=0)
break;
if(fwrite(&buf,1,1,fp2)<=0)
break;
}
//printf("ffp1=%p\n",fp1->_IO_buf_base);
//printf("ffp2=%p\n",fp2->_IO_buf_base);
//fflush(fp2);
//前一半字节搬运完后等待子进程结束
//wait(NULL);
}
else if(pid == 0) //子进程
{
//lseek(fp1->_fileno,sum/2+1,SEEK_SET);
//printf("%ld\n",lseek(fp1->_fileno,sum/2+1,SEEK_SET));
//printf("%ld\n",lseek(fp2->_fileno,sum/2+1,SEEK_SET));
//当光标位置字节数小于等于总数
while((now=lseek(fp1->_fileno,0,SEEK_CUR))<=sum)
{
//printf("%ld\n",now);
if(fread(&buf,1,1,fp1)<=0)
break;
if(fwrite(&buf,1,1,fp2)<=0)
break;
}
//printf("zfp1=%p\n",fp1->_IO_buf_base);
//printf("zfp2=%p\n",fp2->_IO_buf_base);
}
return 0;
}
2、 使用三个进程完成两个文件的拷贝,父进程拷贝前三分之一,子进程1拷贝中间三分之一,子进程2拷贝后三分之一,父进程要阻塞回收所有子进程资源
#include <myhead.h>
int main(int argc, const char *argv[])
{
if(argc != 3)
{
perror("input error");
perror("for example:./a.out srcfile desfile");
return -1;
}
int srcfd;
if((srcfd=open(argv[1],O_RDONLY)) == -1)
{
perror("open srcfile error");
return -1;
}
int desfd;
if((desfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664)) == -1)
{
perror("open desfile error");
return -1;
}
off_t sum=lseek(srcfd,0,SEEK_END); //计算字节总数
char buf; //字符搬运工
pid_t pid1=fork(); //创建第一个子进程
if(pid1 < 0)
{
perror("fork error");
return -1;
}else if(pid1 > 0) //父进程
{
pid_t pid2=fork(); //创建第二个子进程
if(pid2 < 0)
{
perror("fork error");
return -1;
}else if(pid2 > 0)
{
lseek(srcfd,0,SEEK_SET);
lseek(desfd,0,SEEK_SET);
while(lseek(srcfd,0,SEEK_CUR)<=sum/3)
{
if(read(srcfd,&buf,1) <= 0)
break;
if(write(desfd,&buf,1) <=0)
break;
}
fflush(NULL);
wait(NULL);
wait(NULL);
}else if(pid2 == 0)
{
while(lseek(srcfd,0,SEEK_CUR)<=sum*2/3)
{
if(read(srcfd,&buf,1) <= 0)
break;
if(write(desfd,&buf,1) <= 0)
break;
}
fflush(NULL);
}
}else if (pid1 == 0){
while(lseek(srcfd,0,SEEK_CUR)<=sum)
{
if(read(srcfd,&buf,1) <= 0)
break;
if(write(desfd,&buf,1) <= 0)
break;
}
fflush(NULL);
}
return 0;
}
3、思维导图:有道云笔记