int main(int argc,char *argv[])
{
if(argc != 3)
{
printf("err: ./app filename\n");
return -1;
}
int fd_src = open(argv[1],O_RDWR);
if(fd_src<0)
{
perror("open src\n");
exit(3);
}
int fd_dst = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0666);
if(fd_dst < 0)
{
perror("open dst\n");
exit(4);
}
//获取文件原大小
struct stat sbuf;
int ret = fstat(fd_src,&sbuf); //fstat将fd_src所指向的文件信息保存到结构体sbuf中
if(ret < 0)
{
perror("fstat \n") ;
exit(5);
}
int flen = sbuf.st_size; //原文件大小
//根据文件到校扩展目标文件
ret = ftruncate(fd_dst,flen);
if(ret < 0)
{
perror("ftruncate \n");
exit(5);
}
//为源文件创建映射
char* mp_src= (char*)mmap(NULL,flen,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,fd_src,0);
if(mp_src== MAP_FAILED)
{
perror("mp_dsterr");
return -1;
}
close(fd_src);
char* mp_dst= (char*)mmap(NULL,flen,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANON,fd_dst,0);
//求出每个进程拷贝的字节数
int n = 5;//线程数
int bs = flen/n;
int mod = flen%bs; //求出均分后余下的字节数,让最后一个子进程处理
char *temp_src = mp_src;
char *temp_dst = mp_dst;
int i;
pid_t pid = 0;
for (i = 0; i < n; ++i)
if((pid=fork()) == 0)
break;
if(n == i)
{
int j =0;
for (j = 0; j < n; ++j)
wait(NULL);
}else if(i == (n-1)) //最后一个子进程,他多处理均分后剩余的字节数
{
printf("i == %d\n",i);
memcpy(temp_dst+i*bs,temp_src+i*bs,bs+mod);
}else{
printf("i = %d\n",i);
memcpy(temp_dst+i*bs,temp_src+i*bs,bs);
}
//释放映射区
munmap(mp_dst,flen);
munmap(mp_src,flen);