1.使用两个子进程完成两个文件的拷贝,子进程1拷贝前一半内容,子进程2拷贝后一半内容,父进程用于回收两个子进程的资源
#include <head.h>
int main(int argc, const char *argv[])
{
//判断文件是否为3个
if(argc != 3)
{
printf("Input File Error\n");
printf("usage:a.out srcfile dstfile\n");
return -1;
}
int srcfp = -1;
int dstfp = -1;
//以只读形式打开源文件
if((srcfp = open(argv[1],O_RDONLY)) == -1)
{
perror("open error");
return -1;
}
//计算文件总字节数
int length = lseek(srcfp,0,SEEK_END);
//取中间值
int mid = length/2;
//关闭文件表示符
close(srcfp);
//定义一个容器放读取内容
char buf[10]="";
//定义一个变量放进程id1
int pid1 = -1;
//创建第一个子进程
pid1 = fork();
if(pid1 > 0)
{
//定义一个变量放进程id2
int pid2 = -1;
pid2 = fork();
if(pid2 > 0)
{
printf("这是父进程,ppid = %d\n",getppid());
//回收子进程
wait(NULL);
wait(NULL);
printf("父进程成功回收子进程\n");
}else if(pid2 == 0)
{
printf("第二个子进程,pid2 = %d\n",getpid());
//以只读形式打开源文件
if((srcfp = open(argv[1],O_RDONLY)) == -1)
{
perror("open error");
return -1;
}
//以写的形式打开目标文件
if((dstfp = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0664)) == -1)
{
perror("open error");
return -1;
}
int ret1 = -1;
//光标定位到中间
lseek(srcfp,mid+1,SEEK_SET);
lseek(dstfp,mid+1,SEEK_SET);
while((ret1 = read(srcfp,buf,sizeof(buf))))
{
write(dstfp,buf,ret1);
}
//退出子进程
exit(EXIT_SUCCESS);
}else
{
perror("fork error");
return -1;
}
}else if(pid1 == 0)
{
printf("第一个子进程,pid1 = %d\n",getpid());
//以只读形式打开源文件
if((srcfp = open(argv[1],O_RDONLY)) == -1)
{
perror("open error");
return -1;
}
//以写的形式打开目标文件
if((dstfp = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0664)) == -1)
{
perror("open error");
return -1;
}
lseek(srcfp,0,SEEK_SET);
lseek(dstfp,0,SEEK_SET);
int ret = -1;
while(1)
{
ret = read(srcfp,buf,sizeof(buf));
int count =0;
count+=ret;
if(count < mid)
{
write(dstfp,buf,ret);
}
else if(count >= mid)
{
write(dstfp,buf,ret-(count-mid));
break;
}
}
//退出子进程
exit(EXIT_SUCCESS);
}else
{
perror("fork error");
return -1;
}
//关闭文件描述符
close(srcfp);
close(dstfp);
printf("拷贝成功\n");
return 0;
}
2.思维导图