linux多线程-使用mmap映射实现文件拷贝

一、代码实现思路

1、示意图

linux多线程-使用mmap映射实现文件拷贝

2、示意图注解

循环创建i个线程,将src文件分为i段拷贝到dest文件中

(1)src文件的大小为src_size,前i-1个线程拷贝的文件大小为src_size/(i-1),第i个线程拷贝的文件大小为src_size%(i-1)

(2)线程i的文件偏移量=i*(src_size(i-1)),线程i的文件拷贝位置=起始位置+线程i的文件偏移量

二、使用mmap映射—多线程拷贝代码

cpp;gutter:true;</p> <h1>include</h1> <h1>include</h1> <h1>include</h1> <h1>include</h1> <h1>include</h1> <h1>include</h1> <h1>include</h1> <h1>include</h1> <h1>define PTHREAD_NUM 5 //线程数</h1> <p>struct CopyInfo{ char<em> src; char</em> dest; int num; int src_size; };</p> <p>int main(int argc,char *argv[]) { if(argc!=3){ printf("please input correct parameters\n"); return -1; } //1、打开文件src,dest int fd_src=open(argv[1],O_RDONLY); int fd_dest=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0664);</p> <pre><code>//2、使用fstat获取文件src的大小,truncate拓展文件dest的大小 struct stat buf; fstat(fd_src,&buf); int src_size=buf.st_size; truncate(argv[2],src_size); //3、mmap创建文件src,dest的映射,判断映射返回值,关闭文件描述符 char* mmap_src=mmap(NULL,src_size,PROT_READ,MAP_PRIVATE,fd_src,0); char* mmap_dest=mmap(NULL,src_size,PROT_WRITE,MAP_SHARED,fd_dest,0); if(mmap_src==MAP_FAILED||mmap_dest==MAP_FAILED){ perror("mmap err"); return -1; } printf("src_size=%d\n",src_size); close(fd_src); close(fd_dest); //4、循环创建线程,编写线程函数 pthread_t tid[PTHREAD_NUM]; struct CopyInfo copyInfos[PTHREAD_NUM];//创建PTHREAD_NUM个结构体 void* pthread_copy(void *CoIn); for(int i=0;inum*(CoIn->src_size/(PTHREAD_NUM-1));//par_lseek分段偏移量,计算出每段拷贝线程的距离文件起始位置的偏移量 printf("i=%d lseek=%d\n",CoIn->num,par_lseek); if(CoIn->numsrc_size/(PTHREAD_NUM-1); memcpy(CoIn->dest+par_lseek,CoIn->src+par_lseek,copy_size);//CoIn->dest+par_lseek:dest文件的起始位置+分段偏移量 }else //copyInfo->num==(PTHREAD_NUM-1) { int copy_size=CoIn->src_size%(PTHREAD_NUM-1); memcpy(CoIn->dest+par_lseek,CoIn->src+par_lseek,copy_size); } //memcpy(CoIn->dest+par_lseek,CoIn->src+par_lseek,copy_size); //可以在此处内存拷贝 return NULL; </code></pre> <p>}

三、运行截图

linux多线程-使用mmap映射实现文件拷贝

注意事项:

gcc 01_mmap_pthread_copy.c -lpthread 编译线程代码的时候要加-lpthread,否则会报错

gcc对.c文件直接编译后,会生成a.out的可执行文件

一入编程深似海,多学多查多动手

Original: https://www.cnblogs.com/asdzy/p/14296076.html
Author: 阿斯顿之意
Title: linux多线程-使用mmap映射实现文件拷贝

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/684384/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球