System V 共享記憶體區

2021-09-23 20:04:34 字數 3082 閱讀 9123

1、概述

系統呼叫mmap通過對映乙個普通檔案實現共享記憶體。system v 則是通過對映特殊檔案系統shm中的檔案實現程序間的共享記憶體通訊。也就是說,每個共享記憶體區域對應特殊檔案系統shm中的乙個檔案。執行過程是先呼叫shmget,再呼叫shmat。對於每個共享的記憶體區,核心維護如下的資訊結構,定義在標頭檔案中。

1

struct

shmid_ds ;

參考**:

2、system v 共享記憶體區api

使用共享記憶體的流程:

1.程序必須首先分配它。

2.隨後需要訪問這個共享記憶體塊的每乙個程序都必須將這個共享記憶體繫結到自己的位址空間中。

3.當完成通訊之後,所有程序都將脫離共享記憶體,並且由乙個程序釋放該共享記憶體塊。

#include #include 

/*建立乙個新的記憶體共享區或者訪問乙個已經存在的共享記憶體區

返回共享記憶體區識別符號

*/int shmget(key_t key, size_t size, int

shm***);

/*建立或開啟乙個共享記憶體區後,呼叫shmat把它連線到呼叫程序的位址空間

*/void *shmat(int shmid, const

void *shmaddr,int

shm***);

/*當乙個程序完成某個共享記憶體區的使用時,呼叫shmdt斷開這個記憶體區

*/int shmdt(const

void *shmaddr);

/*對記憶體區進行多種操作

cmd取值:

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

ipc_set:給指定的共享記憶體區設定其shmid_ds結果成員

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

*/int shmctl(int shmid, int cmd, struct shmid_ds *buf);

呼叫system v api編寫程式進行測試:

程式1:呼叫shmget函式使用指定的路徑名和長度建立乙個共享記憶體區,程式如下:

1 #include 2 #include 3 #include 4 #include 5 #include 6

7#define svshm_mode (shm_r | shm_w | shm_r>>3 | shm_r>>6)89

int main(int argc,char *ar**)

1023}24

if (optind != argc -2)25

29 length = atoi(ar**[optind + 1

]);30

//建立由使用者指定其名字和大小的共享記憶體區

31 id = shmget(ftok(ar**[optind],0

),length,oflag);

32//

把該記憶體區連線到當前程序的位址空間

33 ptr = shmat(id,null,0

);34 exit(0

);35 }

程式2:呼叫shmctl指定ipc_rmid命令,從系統中刪除乙個共享記憶體區,程式如下:

1 #include 2 #include 3 #include 4 #include 5

6#define svshm_mode (shm_r | shm_w | shm_r>>3 | shm_r>>6)78

int main(int argc,char*ar**)916

//開啟共享記憶體區

17 id = shmget(ftok(ar**[1],0),0

,svshm_mode);

18//

從系統中刪除由id標識的共享記憶體區

19shmctl(id,ipc_rmid,null);

20 exit(0

);21 }

程式3:往共享記憶體區中寫入乙個模式,呼叫shmctl指定ipc_stat命令格式,程式如下:

1 #include 2 #include 3 #include 4 #include 5 #include 6

7#define svshm_mode (shm_r | shm_w | shm_r>>3 | shm_r>>6)89

int main(int argc,char *ar**)

1019 id = shmget(ftok(ar**[1],0),0

,svshm_mode);

20 ptr = shmat(id,null,0

);21 shmctl(id,ipc_stat,&buff); //獲取共享記憶體區大小

22for(i=0;i)

23 *ptr++ = i % 256

;24 exit(0

);25 }

程式4:從共享記憶體去中讀出模式,程式如下:

1 #include 2 #include 3 #include 4 #include 5 #include 6

7#define svshm_mode (shm_r | shm_w | shm_r>>3 | shm_r>>6)89

int main(int argc,char *ar**)

1019 id = shmget(ftok(ar**[1],0),0

,svshm_mode);

20 ptr = shmat(id,null,0

);21 shmctl(id,ipc_stat,&buff);

22for(i=0;i)

2327 exit(0

);28 }

3、system v 與posix 共享記憶體區

二者的差別是:

(1)posix共享記憶體區是先呼叫shm_open然後再呼叫mmap,system v 共享記憶體區是先呼叫shmget再呼叫shmat。

(2)posix共享記憶體區物件的大小可在任何時刻通過ftruncate修改,而system v 共享記憶體區物件的大小是在呼叫shmget建立時固定下來的。

System V 共享記憶體區

system v共享記憶體區在概念上類似於posix共享記憶體區。代之以呼叫shm open後呼叫mmap的是,先呼叫shmget,再呼叫shmat函式。shmget函式建立乙個尚未存在的共享記憶體區,或者訪問乙個已經存在的共享記憶體區。include int shmget key t key,si...

System V 共享記憶體

一.共享記憶體資料結構 對於每個共享記憶體區,核心維護如下資訊結構,定義在,在ubuntu中路徑 usr include linux shm.h 二.system v共享記憶體函式 include include int shmget key t key,size t size,int shm vo...

共享記憶體System V

system v 共享記憶體區 對於每個共享記憶體區,核心維護如下的資訊結構 obsolete,used only for backwards compatibility and libc5 compiles struct shmid ds struct shmid ds 共享記憶體操作api 0....