共享記憶體mmap函式
阿新 • • 發佈:2018-12-14
/*mmap函式 作用:將檔案或裝置空間對映到共享記憶體區 void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); 引數 addr:要對映的起始地址。通常指定為NULL,讓核心自動選擇 len:對映到程序地址空間的位元組數 prot:對映區保護方式 PROT_READ/頁面可讀 PROT_WRITE/頁面可寫 PROC_EXEC/頁面可執行 PROT_NONE/頁面不可訪問 flags:標誌 MAP_SHARED/變動是共享的 MAP_PRIVATE/變動是私有的 MAP_FIXED/準確解釋addr引數 MAP_ANONYMOUS/建立匿名對映區,不涉及檔案 fd:檔案描述符 offset:從檔案頭開始的偏移量 返回值:成功返回對映到記憶體區的起始地址;失敗返回-1 */ #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #define ERR_EXIT(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ }while(0) typedef struct stu { char name[4]; int age; }STU; int main(int argc, char *argv[]) { if(argc != 2){ fprintf(stderr,"Usage:%s <file>\n", argv[0]); eixt(EXIT_FAILURE); } int fd; fd = open(argv[1], O_CREAT | O_RDWR | O_TRUNC, 0666); if(fd == -1) { ERR_EXIT("open"); } lseek(fd, sizeof(STU)*5-1, SEEK_SET); write(fd, "", 1); STU *p; p = mmap(NULL, sizeof(STU)*5, PROT_READ | PROT_WRITE, MAP_SHARED,fd, 0); if( p==NULL) ERR_EXIT("mmap"); char ch = 'a'; int i; for(i=0;i<5;i++) { //向記憶體中寫入,就像向寫到檔案中一樣 memcpy((p+i)->name, &ch, 1);//將資料拷貝到記憶體中 (p+i)->age = 20+i; ch++; } printf("initialize over\n"); munmap(p, sizeof(STU)*5);//取消建立的對映 printf("exit\n"); return 0; }