1、使用两个进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,并且父进程要阻塞回收子进程资源。
linux@linux:~/study/IO/day4/work$ cat cpcp.c
#include<myhead.h>
int main(int argc, const char *argv[])
{
int srcfd,destfd; //定义两个文件描述符
if(argc!=3){
printf("input file error\n");
printf("usage:./a.out srcfile destfile\n");
return -1;
}
//以只读形式打开第一个文件
if((srcfd=open(argv[1],O_RDONLY))==-1)
{
perror("open srcfile error");
return -1;
}
//以只写形式打开第二个文件
if((destfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open destfile error");
return -1;
}
//求出文件大小
int srcsize=lseek(srcfd,0,SEEK_END);
lseek(srcfd,0,SEEK_SET);
pid_t pid;
pid=fork();
if(pid<0)
{
perror("fork error");
return -1;
}else if(pid==0)
{
//子进程
//定义缓存区来搬运数据
char buf[1]="";
int ret=0;
int count=lseek(srcfd,(srcsize/2)+1,SEEK_SET);
while((ret=read(srcfd,buf,sizeof(buf)))>0&&count<=srcsize)
{
write(destfd,buf,ret);
count+=ret;
}
printf("后半部分拷贝完成\n");
}else
{
//父进程
//定义缓存区来搬运数据
char buf[1]="";
int ret=0;
int count=lseek(srcfd,0,SEEK_CUR);
while((ret=read(srcfd,buf,sizeof(buf)))>0&&count<=srcsize/2)
{
write(destfd,buf,ret);
count+=ret;
}
printf("前半部分拷贝完成\n");
wait(NULL);
}
//关闭文件
close(srcfd);
close(destfd);
return 0;
}
运行结果:
linux@linux:~/study/IO/day4/work$ gcc cpcp.c
linux@linux:~/study/IO/day4/work$ ./a.out 01text.txt 02text.txt
前半部分拷贝完成
后半部分拷贝完成
linux@linux:~/study/IO/day4/work$ cat 02text.txt
helloworlIamCJL
2、使用三个进程完成两个文件的拷贝,父进程拷贝前三分之一,子进程1拷贝中间三分之一,子进程2拷贝后三分之一,父进程要阻塞回收所有子进程资源。
linux@linux:~/study/IO/day4/work$ cat 2cpcpcp.c
#include<myhead.h>
int main(int argc, const char *argv[])
{
int srcfd,destfd; //定义两个文件描述符
if(argc!=3){
printf("input file error\n");
printf("usage:./a.out srcfile destfile\n");
return -1;
}
//以只读形式打开第一个文件
if((srcfd=open(argv[1],O_RDONLY))==-1)
{
perror("open srcfile error");
return -1;
}
//以只写形式打开第二个文件
if((destfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open destfile error");
return -1;
}
//求出文件大小
int srcsize=lseek(srcfd,0,SEEK_END);
lseek(srcfd,0,SEEK_SET);
pid_t pid;
pid=fork();
if(pid<0)
{
perror("fork error");
return -1;
}else if(pid==0)
{
//子进程
//定义缓存区来搬运数据
char buf[1]="";
int ret=0;
int count=lseek(srcfd,(srcsize/3)+1,SEEK_SET);
while((ret=read(srcfd,buf,sizeof(buf)))>0&&count<=srcsize/3*2)
{
write(destfd,buf,ret);
count+=ret;
}
printf("第二个1/3部分拷贝完成\n");
}else
{
//父进程
//定义缓存区来搬运数据
char buf[1]="";
int ret=0;
int count=lseek(srcfd,0,SEEK_CUR);
while((ret=read(srcfd,buf,sizeof(buf)))>0&&count<=srcsize/3)
{
write(destfd,buf,ret);
count+=ret;
}
printf("前1/3部分拷贝完成\n");
pid_t pid2=fork();
if(pid2<-1)
{
perror("open destfile error");
return -1;
}else if(pid2==0)
{
//子进程2
char buf[1]="";
int ret=0;
int count=lseek(srcfd,srcsize/3*2,SEEK_SET);
while((ret=read(srcfd,buf,sizeof(buf))>0))
{
write(destfd,buf,ret);
count+=ret;
}
printf("最后1/3部分拷贝完成\n");
}
wait(NULL);
}
//关闭文件
close(srcfd);
close(destfd);
return 0;
}
运行结果:
linux@linux:~/study/IO/day4/work$ gcc 2cpcpcp.c
linux@linux:~/study/IO/day4/work$ ./a.out 01text.txt 03text.txt
前1/3部分拷贝完成
第二个1/3部分拷贝完成
最后1/3部分拷贝完成
linux@linux:~/study/IO/day4/work$ cat 03text.txt
helloworldIIamCJL
3、学习思维导图