作业
使用父子进程完成文件的拷贝
父进程拷贝前一般内容,子进程拷贝后一半内容
子进程结束后,父进程回收子进程的资源
#include<myhead.h>
int main(int argc, const char *argv[])
{
if(argc!=3) //判断输入格式是否正确
{
write(2,"open failed\n",sizeof("open failed\n"));
return -1;
}
int cpf=-1; //只读形式打开源文件
cpf=open(argv[1],O_RDONLY);
if(cpf==-1)
{
perror("open error1");
return -1;
}
int cpt=-1; //读写的形式打开目标文件
cpt=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);
if(cpt==-1)
{
perror("open error1");
return -1;
}
pid_t pid=fork(); //运行子进程
long num=lseek(cpf,0,SEEK_END); //定义变量存放文件总字节数
char buf[20]=""; //搬运工
size_t src=0; //存放read返回值的容器
long sum=0; //总读字节数
if(pid>0)
{
lseek(cpf,0,SEEK_SET); //父进程双文件置于头
lseek(cpt,0,SEEK_SET);
while(1)
{
src=read(cpf,buf,sizeof(buf));
if(src==0)
{
break;
}
sum += src; //总读字节数
//如果sum的总数小于文件大小的一半,就向目标文件进行写入
if(sum <= num/2)
{
write(cpt,buf,src);
}
else if(sum>num/2)
{
write(cpt,buf,num/2-sum+src);
}
}
sleep(3); //睡三秒
}else if(pid==0)
{
lseek(cpf,num/2,SEEK_SET);
lseek(cpt,num/2,SEEK_SET);
while(1)
{
src=read(cpf,buf,sizeof(buf));
if(src==0)
{
break;
}
write(cpt,buf,src);
}
exit(EXIT_SUCCESS); //儿子结束后退出
}else
{
perror("fork error");
return -1;
}
close(cpf);
close(cpt);
wait(NULL); //收尸
return 0;
}

1228

被折叠的 条评论
为什么被折叠?



