作业1:使用多进程完成两个文件的拷贝,父进程拷贝前一半,子进程拷贝后一半,父进程回收子进程的资源
代码:
#include<myhead.h>
//定义获取文件长度的函数
int get_file_len(const char *srcfile, const char *destfile)
{
//以只读的形式打开源文件
int srcfd,destfd;
if((srcfd = open(srcfile, O_RDONLY)) == -1)
{
perror("open srcfile error");
return -1;
}
//以只写创建的形式打开目标文件
if((destfd = open(destfile, O_WRONLY|O_CREAT|O_TRUNC, 0664))==-1)
{
perror("open destfile error");
return -1;
}
//求源文件的大小
int len = lseek(srcfd, 0, SEEK_END);
//关闭两个文件
close(srcfd);
close(destfd);
return len;
}
//定义文件拷贝函数
int copy_file(const char *srcfile, const char *destfile, int start, int len)
{
//以只读的形式打开源文件,以只写的形式打开目标文件
int srcfd,destfd;
if((srcfd = open(srcfile, O_RDONLY)) == -1)
{
perror("open srcfile error");
return -1;
}
if((destfd = open(destfile, O_WRONLY)) == -1)
{
perror("open destfile error");
return -1;
}
//移动文件的光标
lseek(srcfd, start, SEEK_SET);
lseek(destfd, start, SEEK_SET);
//完成拷贝工作
char buf[128] = "";
int sum = 0;
while(1)
{
int res = read(srcfd, buf, sizeof(buf));
sum += res; //将每次读取的数据放入sum中
if( sum>=len ||res == 0)
{
write(destfd, buf, res-(sum-len)); //将最后一次的内容写入
break;
}
//将读取的数据写入目标文件
write(destfd, buf, res);
}
//关闭文件
close(srcfd);
close(destfd);
return 0;
}
/**********************主程序*******************/
int main(int argc, const char *argv[])
{
//判断外部传参
if(argc != 3)
{
printf("input file error\n");
printf("usage:./a.out srcfile destfile\n");
return -1;
}
//定义变量获取源文件的长度
int len = get_file_len(argv[1], argv[2]);
//创建多进程
pid_t pid = fork();
//判断父子进程
if(pid > 0)
{
//父进程
copy_file(argv[1], argv[2], 0, len/2); //父进程拷贝前一半
//阻塞等待子进程的结束
wait(NULL);
}else if(pid == 0)
{
//子进程
copy_file(argv[1], argv[2], len/2, len-len/2); //子进程拷贝后一半
//退出进程
exit(EXIT_SUCCESS);
}else
{
perror("fork error");
return -1;
}
printf("拷贝成功\n");
return 0;
}
效果图: