一、代码实现思路
1、示意图
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>}
三、运行截图
注意事项:
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/
转载文章受原作者版权保护。转载请注明原作者出处!