一、思维导图
二、练习
1、使用父子进程完成两个文件的拷贝,父进程拷贝前一半内容,子进程拷贝后一半内容,子进程结束后退出,父进程回收子进程的资源
#include<myhead.h>
int main(int argc, const char *argv[])
{
//判断终端输入
if(argc != 3)
{
printf("input error!\n");
printf("usage:./a.out srcfilename destfilename\n");
return -1;
}
//以只读的形式打开源文件,只写的形式打开目标文件
int srcfd = -1;
int destfd = -1;
if((srcfd = open(argv[1],O_RDONLY)) == -1)
{
perror("open src error");
return -1;
}
if((destfd = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664)) == -1)
{
perror("open dest error");
return -1;
}
//拷贝
//创建子进程
pid_t pid = -1;
pid = fork();
//定义拷贝容器
char buf[128];
//父进程拷贝一半
if(pid > 0)
{
//循环将源文件数据加载到buf中
while(1)
{
printf("父进程拷贝\n");
int res = read(srcfd,buf,sizeof(buf));
if(res == 0)
{
break;
}
//将读入buf中的数据写入目标文件
write(destfd,buf,res);
}
}
//子进程拷贝一半
if(pid == 0)
{
//循环将源文件数据加载到buf中
while(1)
{
printf("子进程拷贝\n");
int res = read(srcfd,buf,sizeof(buf));
if(res == 0)
{
break;
}
//将读入buf中的数据写入目标文件
write(destfd,buf,res);
}
//退出子进程
exit(EXIT_SUCCESS);
}
//父进程阻塞为子进程收尸
wait(NULL);
printf("父进程为子进程收尸成功\n");
//关闭文件描述符
close(srcfd);
close(destfd);
printf("拷贝成功\n");
return 0;
}