共享記憶體總結

2021-08-01 17:59:04 字數 3478 閱讀 6225

posix共享記憶體涉及以下兩個步驟:

1、指定乙個名字引數呼叫shm_open,以建立以乙個新的共享記憶體區物件或開啟乙個已存在的共享記憶體區物件。

2、呼叫mmap把這個共享記憶體區對映到呼叫程序的位址空間。

標頭檔案:

#include

#include

#include

int shm_open(const char *name, int oflag, mode_t mode);

int shm_unlink(const char *name);

link with -lrt(要注意連線這個庫)

oflag引數是o_crtea|o_rdwr等標誌;

mode引數指定許可權位如果沒有指定o_creat標誌,那麼該引數可以指定為0。(如果是建立的話許可權要給夠,平常是0644的許可權,否則別的程序可能沒有許可權)。

一般建立的檔案是自動放在/dev/shm/的目錄下的。

新建立的檔案大小一般為0,所以mmap函式呼叫檔案識別符號的時候會出錯,這時候要用ftruncate()函式擴大檔案

#include

int ftruncate(int fd,off_t length);    成功返回0,出錯返回-1

對於乙個普通檔案:如果該檔案的大小大於length引數,額外的資料就會被丟掉。

對於乙個共享記憶體區物件:把該物件的大小設定成length位元組。

當開啟乙個已存在的共享記憶體物件時,我們可以呼叫fstat來獲取有關該物件的資訊。    

#include

#include

int fstat(int fd, struct stat *buf);

stat結構有12個或以上的成員,  但當fd指代乙個共享記憶體區物件時,只有四個成員含有資訊。

struct stat;

呼叫時不用定義這個結構體,直接例項化就行了,如:struct stat sta;

下面例子為乙個往共享記憶體裡寫入內容,另乙個讀取。『

讀取端:

#include

#include

#include

#include

#include

#include

int main(int argc,char* argv)

sleep(1);

while(1)

munmap(buf,bufsiz);

close(fd); }

寫入端:

int main(int argc,char* argv)

ftruncate(fd,100);

void* buf = null;

if((buf = mmap(null,bufsiz,prot_write,map_shared,fd,0))== map_failed)

int i;

for(i=2;i

strcpy(buf,argv[i]);

sleep(3); }

munmap(buf,bufsiz);

close(fd); }

system v共享記憶體

#include

int shmget(key_t key,size_t size,int oflag);    返回:成功則為共享記憶體區物件,出錯為-1

key 的值可以是ftok的返回值,也可以是ipc_private.

ftok()               是非親緣程序間

ipc_private         是親緣程序間的

size以位元組為單位指定記憶體區的大小。當實際操作為建立乙個新的共享記憶體區時,必須指定乙個不為0的size值。如果實際操作為訪問乙個已存在的共享記憶體區,那麼size應為0.

oflag是讀寫許可權值的集合,還可以是ipc_creat或ipc_creat|ipc_excl

shmid是shmget返回的識別符號。

如果指定了shm_rnd,那麼相應的共享記憶體區附接到由shmaddr引數指定的位址向下捨入乙個shmlba常值。lba代表「底端邊界位址」。

int shmdt(const void* shmaddr);    返回:成功為0,出錯為-1

當乙個程序終止時,他當前附接著的所有共享記憶體區都自動斷接掉。本函式呼叫並不是刪除所指定的共享記憶體區。

int shmctl(int shmid,int cmd, struct shmid_ds* buff);    返回:成功為0,錯誤為-1

cmd有三個命令:

1、ipc_rmid     從系統中刪除由shmid標識的共享記憶體區並拆除它。

2、  ipc_set     給所指定的共享記憶體區設定其shmid_ds結構的以下三個成員:shm_perm.uid、shm_perm.gid和shm_perm.mode,它們的值來自buff引數指向的結構中的相應成員。shm_ctime的值也用當前時間替換。

3、ipc_stat (通過buff引數)向呼叫者返回所指定共享記憶體區當前的shmid_ds結構。

例子:下面例子為乙個往共享記憶體裡寫入內容,另乙個讀取。

寫入:#include

#include

#include

#include

#include

int main(int argc,char* argv){

key_t key = ftok(argv[1],1);

if(-1 == key){

perror("ftok err");

return 1;

int shmid = shmget(key,0,o_rdwr);

if(-1 == shmid){

perror("shmget err");

return 1;

void* buf = shmat(shmid,null,0);

if((void*)-1 == buf){

perror("shmat err");

return 1;

strcpy(buf,"hello shmat\n");

shmdt(0);

return 0;

讀取:#include

#include

#include

#include

int main(int argc,char* argv){

key_t key = ftok(argv[1],1);

if(-1 == key){

perror("ftok err");

return 1;

int shmid = shmget(key,0,o_rdonly);

if(-1 == shmid){

perror("shmget err");

return 1;

void* buf = shmat(shmid,null,shm_rdonly);

printf("%s\n",buf);

shmdt(null);

printf("shmid:%d\n",shmid);

return 0;

Linux共享記憶體及共享記憶體API

共享記憶體區是最快的ipc 程序間通訊 形式。用共享記憶體從伺服器拷貝檔案資料到客戶端 共享記憶體基本api include include 1.int shmget key t key,size t size,int shm 功能 用來建立共享記憶體 key 是這個共享記憶體段的名字 size 共...

mysql共享記憶體 MySQL全域性共享記憶體介紹

前言 全域性共享記憶體則主要是 mysql instance mysqld程序 以及底層儲存引擎用來暫存各種全域性運算及可共享的暫存資訊,如儲存查詢快取的 query cache,快取連線線程的 thread cache,快取表檔案控制代碼資訊的 table cache,快取二進位制日誌的 binl...

mysql共享記憶體 MySQL全域性共享記憶體介紹

前言 全域性共享記憶體則主要是 mysql instance mysqld程序 以及底層儲存引擎用來暫存各種全域性運算及可共享的暫存資訊,如儲存查詢快取的 query cache,快取連線線程的 thread cache,快取表檔案控制代碼資訊的 table cache,快取二進位制日誌的 binl...