一、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映射---多行程拷貝代碼#include<stdio.h> #include<sys/mman.h> #include<unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<string.h> #include <sys/wait.h> int main(int argc,char* argv[]) { if(argc!=3){ printf("please input correct parameters\n"); return -1; } //1、打開檔案src,dest int fd_src=https://www.cnblogs.com/asdzy/archive/2021/01/16/open(argv[1],O_RDONLY); int fd_dest=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0664); //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=https://www.cnblogs.com/asdzy/archive/2021/01/16/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=https://www.cnblogs.com/asdzy/archive/2021/01/16/=MAP_FAILED||mmap_dest==MAP_FAILED){ perror("mmap err"); return -1; } close(fd_src); close(fd_dest); //4、對檔案src的大小分段,fork創建子行程,撰寫自定義拷貝函式 int n=5;//行程數,開辟n個行程 int paragraph_size=src_size/(n-1); int rear_paragraph_size=src_size%(n-1); int i; for(i=1;i<n;++i){ pid_t pid=fork(); if(pid==0){ break; } } void mmap_copy(char* src,char* dest,int par_sleek,int size); //5、父行程中拷貝最后一段,子行程中拷貝其他段,在父行程中關閉子行程,關閉mmap映射 if(i<n){//子行程 int paragraph_sleek=(i-1)*paragraph_size;//計算偏移量 mmap_copy(mmap_src,mmap_dest,paragraph_sleek,paragraph_size); } if(i==n){//父行程 int paragraph_sleek=(i-1)*paragraph_size;//計算偏移量 mmap_copy(mmap_src,mmap_dest,paragraph_sleek,rear_paragraph_size); while(1)//回收子行程 { pid_t wpid=waitpid(-1,NULL,WNOHANG); if(wpid==-1){ break; }else if(wpid>0){ printf("waitpid wpid=%d\n",wpid); } } munmap(mmap_src,src_size); munmap(mmap_dest,src_size); } return 0; } void mmap_copy(char* src,char* dest,int par_sleek,int size) { memcpy(dest+par_sleek,src+par_sleek,size); }
一入編程深似海,多學多查多動手
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/249287.html
標籤:其他
