linux多进程—使用mmap映射实现文件拷贝

一、mmap共享映射区

1、创建映射区函数mmap

void mmap(void addr,size_t length,int prot,int flags,int fd,off_t offset);

addr 传NULL

length 传映射区长度

prot

PROT_READ 可读

PROT_WRITE 可写

flags

MAP_SHARED 共享的;对内存的修改会影响到源文件(源文件即fd对应的文件)

MAP_PRIVATE 私有的;对内存的修改不会影响源文件

fd 文件描述符,open打开一个文件

offset 偏移量

返回值:

成功返回 可用的内存首地址

失败返回 MAP_FAILED

2、释放映射区munmap

int munmap(void *addr,size_t lenth);

addr 传mmap的返回值

length 传出映射区长度

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

 1 #include
 2 #include
 3 #include
 4 #include 
 5 #include 
 6 #include 
 7 #include<string.h>
 8 #include 
 9
10 int main(int argc,char* argv[])
11 {
12     if(argc!=3){
13         printf("please input correct parameters\n");
14         return -1;
15     }
16     //1、打开文件src,dest
17     int fd_src=open(argv[1],O_RDONLY);
18     int fd_dest=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0664);
19
20     //2、使用fstat获取文件src的大小,truncate拓展文件dest的大小
21     struct stat buf;
22     fstat(fd_src,&buf);
23     int src_size=buf.st_size;
24     truncate(argv[2],src_size);
25     //3、mmap创建文件src,dest的映射,判断映射返回值,关闭文件描述符
26     char* mmap_src=mmap(NULL,src_size,PROT_READ,MAP_PRIVATE,fd_src,0);
27     char* mmap_dest=mmap(NULL,src_size,PROT_WRITE,MAP_SHARED,fd_dest,0);
28     if(mmap_src==MAP_FAILED||mmap_dest==MAP_FAILED){
29         perror("mmap err");
30         return -1;
31     }
32     close(fd_src);
33     close(fd_dest);
34     //4、对文件src的大小分段,fork创建子进程,编写自定义拷贝函数
35     int n=5;//进程数,开辟n个进程
36     int paragraph_size=src_size/(n-1);
37     int rear_paragraph_size=src_size%(n-1);
38
39     int i;
40     for(i=1;ii){
41         pid_t pid=fork();
42         if(pid==0){
43             break;
44         }
45     }
46     void mmap_copy(char* src,char* dest,int par_lseek,int size);
47     //5、父进程中拷贝最后一段,子进程中拷贝其他段,在父进程中关闭子进程,关闭mmap映射
48     if(i//子进程
49         int paragraph_lseek=(i-1)*paragraph_size;//计算偏移量
50         mmap_copy(mmap_src,mmap_dest,paragraph_lseek,paragraph_size);
51     }
52     if(i==n){//父进程
53         int paragraph_lseek=(i-1)*paragraph_size;//计算偏移量
54         mmap_copy(mmap_src,mmap_dest,paragraph_lseek,rear_paragraph_size);
55         while(1)//回收子进程,也可以用信号回收
56         {
57             pid_t wpid=waitpid(-1,NULL,WNOHANG);
58             if(wpid==-1){
59                 break;
60             }else if(wpid>0){
61                 printf("waitpid wpid=%d\n",wpid);
62             }
63         }
64         munmap(mmap_src,src_size);
65         munmap(mmap_dest,src_size);
66     }
67     return 0;
68 }
69 void mmap_copy(char* src,char* dest,int par_lseek,int size)
70 {
71     memcpy(dest+par_lseek,src+par_lseek,size);
72 }){;++

三、运行案例截图

1、代码运行环境

Ubuntu-16.04.3-desktop-amd64

2、运行截图

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

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

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

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

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

(0)

大家都在看

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