1、使用两个进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,并且父进程要阻塞回收子进程资源
#include <myhead.h>
//拷贝函数
void kaobei(int fp1,int fp2,int t)
{
char buf[128]; //接收的容器
int ret=0; //返回的字符数
while((ret=read(fp1,buf,sizeof(buf)))>0)
{
write(fp2,buf,t/2);
}
printf("拷贝成功\n");
}
int main(int argc, const char *argv[])
{
//以只读的方式打开文件
int fp1;
if((fp1=open("01day1.txt",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
//以只写的方式打开第二个文件
int fp2;
if((fp2=open("02day1.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open error");
return -1;
}
pid_t pid;
pid=fork(); //创建一个子进程
if(pid<0)
{
perror("fork error");
return -1;
}
else if(pid==0) //如果fork()返回值为0则执行子进程
{
sleep(2); //睡眠5秒
//求文件大小
int t=lseek(fp1,0,SEEK_END);
lseek(fp1,t/2,SEEK_SET); //将光标定位到距离开头文件大小一半的位置
//调用拷贝函数
kaobei(fp1,fp2,t);
//子进程
printf("我要死了\n");
exit(EXIT_SUCCESS); //子进程退出
}
else //fork()返回值>0时执行父进程
{
//求文件大小
int t=lseek(fp1,0,SEEK_END);
lseek(fp1,0,SEEK_SET); //将光标定位到开头
//调用拷贝函数
kaobei(fp1,fp2,t);
//父进程
printf("我要等待孩子死亡\n");
//阻塞回收子进程资源
wait(NULL);
}
close(fp1);
close(fp2);
return 0;
}
2、使用三个进程完成两个文件的拷贝,父进程拷贝前三分之一,子进程1拷贝中间三分之一,子进程2拷贝后三分之一,父进程要阻塞回收所有子进程资源
#include <myhead.h>
//拷贝函数
void kaobei(int fp1,int fp2,int t)
{
char buf[128]; //接收的容器
int ret=0; //返回的字符数
while((ret=read(fp1,buf,sizeof(buf)))>0)
{
write(fp2,buf,t/3);
}
printf("拷贝成功\n");
}
int main(int argc, const char *argv[])
{
//以只读的方式打开文件
int fp1;
if((fp1=open("01day1.txt",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
//以只写的方式打开第二个文件
int fp2;
if((fp2=open("02day1.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open error");
return -1;
}
pid_t pid;
pid=fork(); //创建一个子进程
if(pid<0)
{
perror("fork error");
return -1;
}
else if(pid==0) //如果fork()返回值为0则执行子进程
{
sleep(2); //睡眠2秒
//求文件大小
int t=lseek(fp1,0,SEEK_END);
lseek(fp1,t/3,SEEK_SET); //将光标定位到距离开头文件大小一半的位置
//调用拷贝函数
kaobei(fp1,fp2,t);
//子进程1
printf("我是子进程1\n");
exit(EXIT_SUCCESS); //子进程1退出
}
else //fork()返回值>0时执行父进程
{
pid_t pid2 = fork(); //在父进程中再创建一个子进程
if(pid2 < 0)
{
perror("fork error");
return -1;
}else if(pid2 == 0) //父进程中的子进程2
{
sleep(5); //睡眠5秒
//求文件大小
//int t=lseek(fp1,0,SEEK_END);
//lseek(fp1,2*t/3,SEEK_SET); //将光标定位到开头
//调用拷贝函数
//kaobei(fp1,fp2,t);
printf("我是子进程2\n");
exit(EXIT_SUCCESS);
}else
{
//求文件大小
int t=lseek(fp1,0,SEEK_END);
lseek(fp1,0,SEEK_SET); //将光标定位到开头
//调用拷贝函数
kaobei(fp1,fp2,t);
printf("我是父进程\n"); //父进程逻辑
wait(NULL);
wait(NULL);
}
}
close(fp1);
close(fp2);
return 0;
}
3、思维导图