**:
共享記憶體(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...