创建出三个进程完成两个文件之间拷贝工作,子进程1拷贝前一半内容,子进程2拷贝后一半内容,父进程回收子进程的资源
#include <myhead.h>
int main(int argc, const char *argv[])
{
if(argc!=3)
{
puts("终端输入格式不合理");
return -1;
}
//先定义文件标识符
int src=0;
int dest=0;
pid_t pid=-1;
pid = fork();
//定义一个字符搬运工
char buf[20]="";
if((src=open(argv[1],O_RDONLY))==-1)
{
perror("打开源文件错误");
return -1;
}
off_t size_src=lseek(src,0,SEEK_END); //确定文件大小
lseek(src,0,SEEK_SET); //回到开头
off_t half_size=size_src/2; //确定中间位置
if(pid == 0)
{
if((dest=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("打开目标文件错误");
return -1;
}
off_t count=0; //定义一个计数器来判断是否到中间
while(count<half_size)
{
int res =read(src,buf,sizeof(buf));
write(dest,buf,res);
count+=res;
}
//先关闭文件
close(src);
close(dest);
//
}
else if(pid>0)
{
pid_t pid2 = fork();
if(pid2>0)
{
wait(NULL);
}else if(pid2 == 0)
{
if((src=open(argv[1],O_RDONLY))==-1)
{
perror("打开源文件错误");
return -1;
}
if((dest=open(argv[2],O_WRONLY,0664))==-1)
{
perror("打开目标文件错误");
return -1;
}
//将文件定位到中间位置
lseek(src,half_size,SEEK_SET);
while (1)
{
int res = read(src, buf, sizeof(buf));
if (res > 0) {
write(dest, buf, res);
//count += res;//用于追踪整个循环过程中成功读取的总字节数
} else if (res == 0) {
//判断是否到达文件末尾
break;
} else {
//读取文件错误
perror("读取文件错误");
break;
}
}
close(src);
close(dest);
exit(EXIT_SUCCESS);
}else
{
perror("");
return -1;
}
wait(NULL);
exit(EXIT_SUCCESS);
wait(NULL);
}
else
{
perror("");
return -1;
}
wait(NULL);
wait(NULL);
printf("父进程退出\n");
return 0;
}
这段代码只能复制一半