共享記憶體與其他程序通訊方式相比較,不需要複製資料,直接讀寫記憶體,是一種效率非常高的程序通訊方案。但它本身不提供同步訪問機制,需要我們自己控制。在linux中,只要把共享記憶體段連線到程序的位址空間中,這個程序就可以訪問共享記憶體中的位址了。
linux系統提供的共享記憶體操作函式與訊號量、訊息佇列等類似,主要有以下幾個:
(1) int shmget(key_t key,int shmsz,int shm***);
(2) void *shmat(int shmid,const void *shmaddr, int shm***);
如果shmaddr為0 則此段連線到由核心選擇的第乙個可用位址上,這是推薦的使用方式
如果shmaddr非零,並且沒有指定shm_rnd,則此段鏈結到addr所指的位址上
如果shmaddr非零且指定shm_rnd,則此段鏈結到shmaddr - (addr mod ulus shmlba)所表示的位址上。shm_rnd的意思是低邊界位址倍數,它總是2的乘方。該算式是將位址向下取最近的乙個shmlba的倍數
(3) int shmdt (const void *shmaddr);
(4) int shmctl(int shmid, int cmd,struct shmid_ds *buf);
以上各函式含義如下:
shmget()函式分配一塊新的共享記憶體。shmsz指明共享記憶體的大小,以位元組為單位,shm***的設定與訊號量的semget()函式中的引數sem***類似。
如果shmget()函式呼叫成功則返回共享記憶體的id;否則返回-1.
shmat()函式的作用是連線共享記憶體與某個程序的位址空間。shmid是shmget()函式返回的共享記憶體id。shmaddr是共享記憶體連線到程序中的存放位址,一般設定為空指標,表示交由系統完成這個工作。shm***設定共享記憶體的控制選項,有兩個可能取值:shm_rnd(與shmaddr引數相關)與shm_rdonly(只允許讀)。如果shmat()函式呼叫成功則返回指向共享記憶體的指標;否則返回-1.
shmdt()函式用來解除程序與共享記憶體區域的關聯,使當前程序不能繼續訪問共享記憶體。引數shmaddr是shmat()函式返回的指標。如果操作成功則返回0;失敗則返回-1.
shmctl()函式實現對共享記憶體區域的控制操作。其用法與訊息佇列的msgctl()函式類似。
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....
System V共享記憶體
標頭檔案 include include intshmget key t key,size t size,int shm 功能 用來建立共享記憶體 引數 a key 這個共享記憶體段名字 b size 共享記憶體大小 c shm 由幾個許可權標誌構成,他們的用法和建立檔案時使用的model模式標誌是...