《linux高性能服務器編程》—— 一種多個獨立進程共享內存的方式

(1)源代碼

#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>

#define BUFFER_SIZE 1024

int shmfd; //文件描述符
char* share_mem; //指向共享內存的起始地址
const char* shm_name = "/my_shm"; //文件名

shmfd = shm_open(shm_name, O_CREAT | O_RDWR, 0666); //在/dev/shm/目錄下創建or打開以shm_name爲名的文件
assert(shmfd != -1);

int ret = ftruncate(shmfd, BUFFER_SIZE); //調整文件大小
assert(ret != -1);

//在進程的虛擬地址空間中尋找一塊連續區域,將shmfd指向的文件映射到此區域
share_mem = (char*)mmap(NULL, BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0);
assert(share_mem != MAP_FAILED);

close(shmfd); //無需文件描述符,使用share_mem即可訪問共享內存

/*
使用共享內存
...
...
*/

munmap((void*)share_mem, BUFFER_SIZE); //解除映射關係

shm_unlink(shm_name); //將此文件標記爲待刪除,當所有使用該文件的進程都解除映射關係後,將此文件從物理內存中刪除

(2)建立映射示意圖

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