1. 程式人生 > >Linux共享記憶體物件,shm_open,mmap

Linux共享記憶體物件,shm_open,mmap

Linux共享記憶體物件

概述

linux下,每個程序都有自己擁有的記憶體區域,程序的記憶體總是私有的。共享記憶體是從系統的空閒記憶體池中分配的,希望訪問它的每個程序連線它。這個連線過程稱為對映。對映後,每個程序都可通過訪問自己的記憶體而訪問共享記憶體區域,從而與其他程序進行通訊。如下圖:
這裡寫圖片描述

函式原型

int shm_open(const char *name, int oflag, mode_t mode);//開啟建立共享記憶體檔案
     返回值:成功返回fd>0
           失敗返回fd<0
int shm_unlink(const char *name);//刪除共享記憶體
int ftruncate(int fd, off_t length);//重置共享記憶體檔案大小
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);//地址對映
引數說明:
    addr:   建立對映區的首地址,由Linux核心指定。使用時,直接傳遞NULL
    length: 欲建立對映區的大小
    prot:   對映區許可權PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE
    flags:  標誌位引數(常用於設定更新物理區域、設定共享、建立匿名對映區)
            MAP_SHARED:  會將對映區所做的操作反映到物理裝置(磁碟)上,無血緣關係的程序通訊
            MAP_PRIVATE: 對映區所做的修改不會反映到物理裝置。
            MAP_ANONYMOUS:匿名對映區
    fd:     用來建立對映區的檔案描述符
    offset: 對映檔案的偏移(4k的整數倍)

int munmap(void *addr, size_t length);//解除對映

示例程式碼

程序1,寫入資料

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
//程序1,寫入資料:write by t08
int main()
{
    int fd = shm_open("/sz02-shm", O_CREAT|O_RDWR|O_EXCL, 0777);
    if
(fd < 0) // 說明這個共享記憶體物件已經存在了 { fd = shm_open("/sz02-shm", O_RDWR, 0777); printf("open ok\n"); if(fd < 0) { printf("error open shm object\n"); return 0; } } else { printf("create ok\n"); // 說明共享記憶體物件是剛剛建立的 ftruncate(fd, 1024
); // 設定共享記憶體的尺寸 } char* ptr = (char*)mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); close(fd); strcpy(ptr, "write by t08"); //shm_unlink("/sz02-shm"); return 0; }

程序2 讀取共享資料

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
//程序2 讀取共享資料
int main()
{
    int fd = shm_open("/sz02-shm", O_RDWR, 0777);
    if(fd < 0)//不存在共享記憶體物件
     {
         printf("error open shm object\n");
         return 0;
     }
    char* ptr = (char*)mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    close(fd);
    getchar();
    printf("%s\n", ptr);
    return 0;
}