作业 : 使用两个子进程完成两个文件的拷贝,子进程1拷贝前一半内容,子进程2拷贝后一般内容,父进程用于回收两个子进程的资源
cpp
#include <head.h>
int main(int argc, const char *argv[])
{
int rd = -1;
if((rd=open("./01_test.c",O_RDONLY))==-1) //打开一个文件以只读的方式
{
perror("open error\n");
return -1;
}
int wd = -1; //以写的方式打开一个文件,若文件不存在则创建,存在则清空
if((wd=open("./text.txt",O_WRONLY|O_CREAT|O_TRUNC, 0664))==-1)
{
perror("write error\n");
return -1;
}
char res[128]=""; //定义一个字符串当中转站
int seek = lseek(rd,0,SEEK_END); //定义seek获取文件内容的大小,lseek函数的返回值是文件的大小
int count = 0; //定义count来接收read的返回值
int pid = fork(); //创建子进程
if(pid > 0) //如果pid大于0则为父进程
{
//父进程
//回收子进程的资源
wait(NULL);
wait(NULL);
int pid2 = fork(); //在父进程中再创建子进程
if(pid2>0) //父进程
{
}
else if(pid2 == 0) //再次创建的子进程
{
//子2进程
lseek(rd,0,SEEK_SET); //将光标偏移到文件开头
while(1)
{
if(seek/2 == lseek(rd,0,SEEK_CUR)) //如果文件偏移到文件中间,则跳出循环
{
break;
}
count=read(rd,res,sizeof(res)); //读写文件
write(wd,res,count);
}
exit(EXIT_SUCCESS); //退出子进程
}
else
{
perror("pids error\n");
return -1;
}
}
else if(pid == 0) //子2进程
{
//休眠1秒等另一个进程拷贝完毕
sleep(1);
//光标移动到文件中央
lseek(rd, 0, SEEK_CUR);
while(1)
{
if(count==0) //如果read的返回值为0,说明文件读取完毕,跳出循环
{
break;
}
count = read(rd,res,sizeof(res)); //读写文件
write(wd,res,count);
}
exit(EXIT_SUCCESS); //退出子进程
}
else
{
perror("pidx error\n");
return -1;
}
printf("拷贝完成\n");
close(wd);
close(rd);
return 0;
}
思维导图