一.作业
1> 使用父子进程完成两个文件的拷贝
父进程拷贝前一半内容,子进程拷贝后一半内容
子进程结束后退出,父进程回收子进程的资源
#include <myhead.h>
//定义求源文件长度的函数
int lenmain(const char *src,const char *dst)
{
int fd1=0;//源文件
int fd2=0;//目标文件
if (-1==(fd1=open(src,O_RDONLY))||-1==(fd2=open(dst,O_WRONLY|O_CREAT|O_TRUNC,0664)))
{
printf("求长度失败失败\n");
return -1;
}
//求文件长度
int len=lseek(fd1,0,SEEK_END);
close(fd1);
close(fd2);
return len;
}
//定义拷贝函数
int kaobei(const char*src,const char*dst,int start,int len)
{
int fd1=0;//源文件
int fd2=0;//目标文件
if (-1==(fd1=open(src,O_RDONLY))||-1==(fd2=open(dst, O_WRONLY)))
{
printf("拷贝失败\n");
return -1;
}
//把光标定到要拷贝的位置
lseek(fd1, start, SEEK_SET);
lseek(fd2, start, SEEK_SET);
char buf1[1]="";//定义容器存储
int sum=0;//表示读取个数
while (1)
{
int res=read(fd1,buf1,sizeof(buf1));//先从fd1读取数据
sum+=res;
if (res==0&&sum>=len)//如果读取数据个数为0则停止循环
{ //如果读到指定位置停止
break;
}
write(fd2,buf1,res);
}
//关闭文件
close(fd1);
close(fd2);
printf("拷贝成功\n");
return 0;
}
/***************主函数*******************/
int main(int argc, char const *argv[])
{
if (argc!=3)
{
printf("input file error!!!\n");
printf("usage:./a.out filename\n");
return -1;
}
int len=lenmain(argv[1],argv[2]);
pid_t pid = -1;//定义变量存储创建的进程id号
pid =fork();//创建一个子进程
//对pid进行判断
if (pid>0)
{
//调用拷贝函数
kaobei(argv[1],argv[2],0,len/2);//开头到中间
}else if(pid==0)
{
//调用拷贝函数
kaobei(argv[1],argv[2],len/2,len);//中间到最后
sleep(3);
_exit(EXIT_SUCCESS);
}else
{
perror("fork error");
return -1;
}
//回收子进程资源
sleep(5);
waitpid(-1,NULL,WNOHANG);//非阻塞
printf("回收子进程资源成功\n");
return 0;
}