UNIX LINUX程式設計學習之程序通訊 共享記憶體

2021-05-27 10:48:49 字數 3782 閱讀 8825

**:

共享記憶體(shared memory) 

共享記憶體,簡單的說就是被多個程序共享的記憶體。它在各種程序通訊方法中是最快的,因為它是將資訊直接對映到記憶體中, 

省去了其它 ipc方法的中間步驟。 

1.shmid_ds 

共享記憶體也有乙個給系統記憶體用來儲存相關資訊的機構,就是shmid_ds。 

c**  

struct

shmid_ds  

其中: 

shm_perm    成員儲存了共享記憶體物件的訪問許可權及其它一些資訊。 

shm_segsz   成員定義了共享的記憶體大小(以位元組為單位)。 

shm_atime   成員儲存了最近一次程序連線共享記憶體的時間。 

shm_dtime   成員儲存了最近一次程序斷開與共享記憶體的連線的時間。 

shm_ctime   成員儲存了最近一次 shmid_ds 結構內容改變的時 

shm_cpid     成員儲存了建立共享記憶體的程序的 pid。 

shm_lpid      成員儲存了最近一次連線共享記憶體的程序的 pid。 

shm_nattch  成員儲存了與共享記憶體連線的程序數目。 

剩下的三個成員被核心保留使用,這裡就不介紹了。 

有關的函式 

1、sys_shmget()函式 

使用shmget()函式來建立新的獲取得已有的共享記憶體。 

系統呼叫:shmget() 

函式宣告:int shmget(key_t key,int size,int shm***); 

返回值:shared memory segment identigier on success 

-1 on error: errno = 

shmget()函式的第乙個引數key 是共享記憶體的關鍵字;第二個引數 size 是建立的共享記憶體的大小,以位元組為單位。第三個參 

數 shm*** 是控制函式行為的標誌量,其取值的含義和作用和 msgget()及semget()函式的對應引數都是相同的. 

c**  

intopen_shm(key_t keyval, 

intsegsize)  

return

(shmid);  

}  

2、shmat()函式 

當乙個程序使用 shmget()函式得到了共享記憶體的識別符號之後,就可以使用shmat()函式來將共享記憶體對映到程序自己的內 

存空間內。 

系統呼叫:shmat() 

函式宣告: int shmat(int shmid, char *shmaddr, int shm***); 

返回值: address at which segment was attached to the process, or 

-1 on error: errno = 

第乙個引數是共享記憶體的識別符號。 

第二個引數 shmaddr 指定了共享記憶體對映的位址。因為這樣必須要預先分配記憶體,十分不便,所以我們在使用時常常將這 

個引數置零,這樣系統會自動為對映分配一塊未使用的記憶體。如果指定了位址,可以給第三個引數 shm*** 指定shm_rnd 

標誌來強迫將記憶體大小設定為頁面的尺寸。 

如果指定了 shm_rdonly引數,共享記憶體將被對映成唯讀。 

對映成功後,函式返回指向對映記憶體的指標。 

下面的這段**演示了 shmat()函式的使用: 

c**  

char

*attach_segment( 

intshmid )  

得到了對映記憶體的指標之後,我們就可以像讀寫普通記憶體一樣對共享記憶體進行讀寫了。 

3、shmctl()函式 

和前兩個 ipc 物件一樣,共享記憶體也有乙個直接對其進行操作的函式,就是 shmctl()函式。 

系統呼叫: shmctl() 

函式宣告:int shmctl(int shmqid, int cmd, struct shmid_ds *buf); 

返回值:0 on success 

-1 on error: errno = 

這個函式和 msgget()函式十分相似,用法也相同。它支援的操作有: 

ipc_stat   獲得共享記憶體的資訊。 

ipc_set   設定共享記憶體的資訊。 

ipc_rmid   刪除共享記憶體。 

4、shmdt()函式 

當乙個程序不再需要某個共享記憶體的對映時,就應該使用 shmdt()函式斷開對映。 

系統呼叫: shmdt() 

函式宣告: int shmdt ( char *shmaddr ); 

返回值: -1 on error: errno = einval (invalid attach address passed) 

shmdt()函式唯一的引數是共享記憶體對映的指標。 

共享記憶體應用舉例——shmtool,互動式的共享記憶體使用工具 

c**  

shmtool.c  

#include 

#include 

#include 

#define segsize 100

writeshm(int

shmid, 

char

*segptr, 

char

*text)  

readshm(int

shmid, 

char

*segptr)  

removeshm(int

shmid)  

changemode(int

shmid, 

char

*mode)  

usage()  

main(int

argc, 

char

*argv)  

}  else

/* attach (map) the shared memory segment into the current process */

if((segptr= shmat(shmid,0,0))==-1)  

switch

(tolower(argv[1][0]))  

}  /home/l/g/tomotoboy/ipc/shm >shmtool r  

shared memory segment exists - opening as client  

segptr: test  

/home/l/g/tomotoboy/ipc/shm >shmtool w "hello:this is a test"

shared memory segment exists - opening as client  

done..  

/home/l/g/tomotoboy/ipc/shm >shmtool r  

shared memory segment exists - opening as client  

segptr: hello:this

is a test  

/home/l/g/tomotoboy/ipc/shm >shmtool d  

shared memory segment exists - opening as client  

shared memory segment marked for

deletion  

/home/l/g/tomotoboy/ipc/shm >shmtool r  

creating new

shared memory segment  

segptr:  

UNIX LINUX程式設計學習之檔案鎖 記錄鎖

鎖定中的幾個概念 檔案鎖定的是整個檔案,而記錄鎖定只鎖定檔案的某一特定部分。unix 的記錄指的是從檔案的某一相對位置開始的一段連續的位元組流,它不同於其它以強制性記錄結構阻止檔案的作業系統,因此,unix 記錄鎖更恰當的稱呼應該是範圍鎖,它是對檔案某個範圍的鎖定。檔案和記錄鎖定可分為諮詢式鎖定和強...

Unix Linux環境程式設計學習總結

這段時間學習了unix環境高階程式設計,在這裡呢,先給大家推薦一本書 unix環境高階程式設計 這本書在這個領域可是聖經級別的。先說一下這段時間的學習感受,起初學習了幾天之後,休息了一段時間,於是自己照著那本聖經開始看了起來,有很多難懂的地方,看著看著,難免心態有點崩潰,但是還是咬著牙看了下去,雖然...

UNIX LINUX程式設計書籍

排名不分先後 1.c語言 高質量程式設計指南 c語言介面與實現 c語言解惑 c專家程式設計 c陷阱與缺陷 c語言參考手冊 2.linux應用開發 unix網路程式設計 第1,2卷 unix環境高階程式設計 linux系統程式設計 unix linux程式設計實踐教程 linux程式設計 第3版 un...