使用多进程完成两个文件的拷贝,父进程拷贝前一半,子进程拷贝后一半,父进程回收子进程的资源
#include<myhead.h>
#define MAXSIZE 100
int main(int argc, const char *argv[])
{
//判断是否进行了外部传参
if(argc !=3)
{
printf("input file error\n");
printf("usage:./a.out srcfile destfile\n");
return -1;
}
char buf[MAXSIZE];
//以只读的形式打开源文件
FILE *srcfp=NULL;
if((srcfp=fopen(argv[1],"r"))==NULL)
{
perror("srcfp error");
return -1;
}
//使用fseek和ftell函数定位到文件的数量
//fseek(文件指针,偏移量,开始的位置)
//ftell(文件中指针),直接返回文件的位置,既把指针最后的位置,返回文件数量
int num=0; //计数
fseek(srcfp,0,SEEK_END); //光标偏移到文件最后的位置
num=ftell(srcfp); //返回值就是文件的数量
fseek(srcfp,0,SEEK_SET); //光标偏移到文件开头的位置
//定义追加写的形式打开文件
FILE *destfp=NULL;
if((destfp=fopen(argv[2],"a"))==NULL)
{
perror("destfp error");
return -1;
}
//创建一个子进程
pid_t pid=fork();
if(pid>0)
{
printf("父进程:拷贝文档前一部分\n");
//追加形式打开文件
FILE *destfp = NULL;
if((destfp = fopen(argv[2],"a"))==NULL)
{
perror("fopen error");
return -1;
}
//清零
bzero(buf,sizeof(buf));
//光标移动到文件开头位置
fseek(srcfp,0,SEEK_SET);//光标定位到开头偏移到num/2
//需要限制位置用fread
int count=fread(buf,sizeof(buf[0]),num/2,srcfp);
//使用fwrite写入
fwrite(buf,sizeof(buf[0]),count,destfp);
//关闭被写入文件
fclose(destfp);
sleep(3);
printf("前半部分拷贝完成\n");
//退出父进程
}
else if(pid==0)
{
printf("子进程:拷贝文档后一部分\n");
//只写形式打开文件
FILE *destfp = NULL;
if((destfp = fopen(argv[2],"a"))==NULL)
{
perror("fopen error");
return -1;
}
//清零
bzero(buf,sizeof(buf));
//光标移动到文件开头位置
fseek(srcfp,num/2,SEEK_SET);//光标定位到开头偏移到num/2
//需要限制位置用fread
int count=fread(buf,sizeof(buf[0]),num-num/2,srcfp);
//使用fwrite写入
fwrite(buf,sizeof(buf[0]),count,destfp);
//关闭所有文件
fclose(srcfp);
fclose(destfp);
sleep(3);
printf("后半部分拷贝完成\n");
//退出子进程
exit(EXIT_SUCCESS);
}
else
{
perror("fork error\n");
return -1;
}
wait(NULL);
printf("回收子进程成功\n");
return 0;
}