共享內存mmap

   mmap的是將文件指定的區域映射到內存緩衝區中,從緩衝區中讀取數據就相當於從文件中讀取相應數據,對緩衝區進行寫操作相當於寫入文件相應位置。

  void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);//將文件映射到內存中,addr和offset通常爲0,length是映射的內存長度,prot是內存的權限(不能高於fd的打開權限),flags是內存屬性
  int munmap(void *addr, size_t length);//解除該映射
    一個實例,將文件映射到內存然後直接操作內存從而寫入文件

#include<stdio.h>
#include<string.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
int main(){
    int fd=open("1.txt",O_RDWR|O_CREAT,S_IRWXU);//創建文件
    lseek(fd,49,SEEK_SET);//由於剛創建的文件爲空,需要先擴充文件內容,才能mmap映射至內存後操作內存,不然會報錯
    write(fd," ",1);//象徵性的寫一個字
    void *buf=mmap(NULL,30,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//length參數不足一個內存頁按照一個內存頁計算(512B)
    memcpy(buf,"hello world\nso beautiful\n",strlen("hello world\nso beautiful\n"));//直接操作內核緩衝區,最後的結果寫入文件
    printf("%s",buf);
    //msync(buf,30,MS_SYNC);//等到寫入文件後返回,這裏未使用
    //munmap(buf,20);//解除映射
    exit(0);
}
文件內容:

hello world
so beautiful

    在網絡編程中,文件映射可以快速IO,因爲這比read/write組合調用少了內核緩衝區到用戶態緩衝區(read)和用戶緩衝區到內核態(write)兩次拷貝。

    mmap還可以作爲內存共享,這種方式通常不映射文件,將mmap函數參數的flags置爲MAP_ANNON,fd置爲-1,就可以實現內存共享(沒有映射到文件),創建一個length大小的可讀寫的共享內存方式例如:

void* mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_ANON|MAP_SHARED,-1,0)
    當有了共享內存後,多個親緣進程間就可以通過內存指針進行通信。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章