
使用两个子进程完成两个文件的拷贝,子进程1拷贝前一半内容,子进程2拷贝后一半内容,父进程用于回收两个子进程的资源
#include<myhead.h>
//计算大小
int sizefile(const char* str1,const char* str2)
{
int fd1,fd2;
if((fd1 = open(str1,O_RDONLY))== -1)
{
perror("open");
return -1;
}
if((fd2 = open(str2,O_RDWR|O_CREAT|O_TRUNC,0664))== -1)
{
perror("open");
return -1;
}
int len=lseek(fd1,0,SEEK_END);
close(fd1);
close(fd2);
return len;
}
//拷贝内容
int cpy_file(const char* str1,const char* str2,int head,int len)
{
int fd1,fd2;
if((fd1 = open(str1,O_RDONLY))== -1)
{
perror("open");
return -1;
}
if((fd2 = open(str2,O_RDWR))== -1)
{
perror("open");
return -1;
}
char buf[128]="";
int res=0;
int num = 0;
lseek(fd1,head,SEEK_SET);
lseek(fd2,head,SEEK_SET);
while(1)
{
res = read(fd1,buf,sizeof(buf));
num += res;
if(num >= len || res == 0)
{
write(fd2,buf,res-(num-len));
break;
}
write(fd2,buf,sizeof(buf));
}
close(fd1);
close(fd2);
return 0;
}
/************************主函数******************************************/
int main(int argc, const char *argv[])
{
if(argc != 3)
{
printf("error\n");
return -1;
}
//计算大小
int len = sizefile(argv[1],argv[2]);
//创建子程序
pid_t pid1 = fork();
if(pid1 == 0)
{
//子程序1
cpy_file(argv[1],argv[2],len/2,len-len/2);
exit(EXIT_SUCCESS);
}
else if(pid1 > 0)
{
//父进程
int pid2 = fork();
if(pid2 == 0)
{
//第二个子程序
//复制
cpy_file(argv[1],argv[2],0,len/2);
exit(EXIT_SUCCESS);
}
else if(pid2 > 0)
{
//父进程
wait(NULL);
wait(NULL);
}
else
{
perror("fork2 error");
return -1;
}
}
else
{
perror("fork1 error");
return -1;
}
return 0;
}
效果图:

#include<myhead.h>
int main(int argc, const char *argv[])
{
int pid=-1;
int fd = -1;
int fa = -1;
int fb = -1;
//求出文件大小
size_t size_fork = -1;
if((fd = open("./cpy.txt",O_RDONLY))== -1)
{
perror("open error");
return -1;
}
size_fork=lseek(fd,0,SEEK_END);
char str1[100]="0";
char str2[100]="0";
//创建第一个子进程
pid = fork();
//判断在父进程中再次创建一个子进程
if(pid > 0)
{
pid = -1;
//创建第二个子进程
pid = fork();
if(pid > 0)
{
//父进程——————主文件
//打开主文件
wait(NULL);
wait(NULL);
}
else if(pid == 0)
{
//子程序——————拷贝文件的下一半
//打开第一个文件
if((fa = open("./1.txt",O_WRONLY|O_TRUNC))== -1)
{
perror("open error");
return -1;
}
lseek(fd,size_fork/2,SEEK_SET);
//read(fd,str2,size_fork/2);
//write(fa,str2,size_fork/2);
//exit(EXIT_SUCCESS);
int num = 0;
int res = 0;
while(1)
{
res=read(fd,str2,sizeof(str1));
num += res;
if(num >= size_fork-size_fork/2)
{
write(fa,str2,res-(num-size_fork/2));
break;
}
write(fa,str2,res);
}
exit(EXIT_SUCCESS);
}
else
{
perror("fork error");
return -1;
}
}
else if(pid == 0)
{
//子进程—————拷贝主文件的上一半
//打开二个子文件
if((fb = open("./2.txt",O_WRONLY|O_TRUNC))==-1)
{
perror("open error");
return -1;
}
lseek(fd,0,SEEK_SET);
int num = 0;
int res = 0;
while(1)
{
res=read(fd,str1,sizeof(str1));
num += res;
if(num >= size_fork/2)
{
write(fb,str1,res-(num-size_fork/2));
break;
}
write(fb,str1,res);
}
exit(EXIT_SUCCESS);
}
else
{
perror("fork error");
return -1;
}
close(fd);
close(fa);
close(fb);
return 0;
}
效果图:



文章描述了一个使用C语言实现的多进程文件拷贝方法,通过两个子进程分别处理文件的前后半部分,主进程负责管理子进程资源。展示了fork()函数的使用以及如何进行文件读写操作。

481

被折叠的 条评论
为什么被折叠?



