1> 使用父子进程完成两个文件的拷贝
父进程拷贝前一半内容,子进程拷贝后一半内容
子进程结束后退出,父进程回收子进程的资源
#include<myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid = -1;
//创建两个进程
pid = fork();
//父进程
if(pid >0)
{
//打开源文件
int sfd = -1;
if((sfd=open("./file.txt",O_RDONLY))==-1)
{
perror("open error");
}
//打开目标文件
int dfd = -1;
if((dfd=open("text.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open error");
}
char buf[2] = ""; //创建容器
int pos = lseek(sfd,0,SEEK_END); //把光标定位到文件尾部,返回文件大小
lseek(sfd,0,SEEK_SET); //获取文件大小后把光标重新定位到开头
int k = 0; //用以计数
while(k<pos/2) //读写一半的内容
{
int res = read(sfd,buf,sizeof(buf)-1);
write(dfd,buf,res);
k++;
}
//关闭文件
close(sfd);
close(dfd);
}
//子进程
else if(pid == 0)
{
//打开源文件
int sfd = -1;
if((sfd=open("./file.txt",O_RDONLY))==-1)
{
perror("open error");
}
//打开目标文件
int dfd = -1;
if((dfd=open("text.txt",O_WRONLY|O_CREAT|O_APPEND,0664))==-1)
{
perror("open error");
}
char buf[2] = ""; //定义容器
int pos = lseek(sfd,0,SEEK_END); //获取文件大小
lseek(sfd,pos/2,SEEK_SET); //将光标定位到源文件内容的一半处
while(1)
{
int res = -1;
if((res=read(sfd,buf,sizeof(buf)-1))==0)
{
break;
}
write(dfd,buf,res);
}
//关闭文件
close(sfd);
close(dfd);
sleep(3); //休眠3s
exit(0); //结束进程
}
else
{
perror("fork error");
}
sleep(5); //休眠5s等待子进程在3s后成为僵尸进程
wait(NULL);//回收子进程
sleep(2); //休眠2s用以观察僵尸进程被回收了
printf("回收子进程成功\n");
return 0;
}
2> 详细绘制思维导图