三、示例程式
四、其它的操作命令
共享記憶體(shared memory)就是允許多個程序訪問同乙個記憶體空間,是在多個程序之間共享和傳遞資料最高效的方式。作業系統將不同程序之間共享記憶體安排為同一段物理記憶體,程序可以將共享記憶體連線到它們自己的位址空間中,如果某個程序修改了共享記憶體中的資料,其它的程序讀到的資料也將會改變。
共享記憶體並未提供鎖機制,也就是說,在某乙個程序對共享記憶體的進行讀寫的時候,不會阻止其它的程序對它的讀寫。如果要對共享記憶體的讀/寫加鎖,可以使用訊號燈。
linux中提供了一組函式用於操作共享記憶體,程式中需要包含以下標頭檔案:
#include
#include
shmget函式用來獲取或建立共享記憶體,它的宣告為:
int
shmget
(key_t key, size_t size,
int shm***)
;
引數key是共享記憶體的鍵值,是乙個整數,typedef unsigned int key_t,是共享記憶體在系統中的編號,不同共享記憶體的編號不能相同,這一點由程式設計師保證。key用十六進製制表示比較好。
引數size是待建立的共享記憶體的大小,以位元組為單位。
引數shm***是共享記憶體的訪問許可權,與檔案的許可權一樣,0666|ipc_creat表示全部使用者對它可讀寫,如果共享記憶體不存在,就建立乙個共享記憶體。
void
*shmat
(int shm_id,
const
void
*shm_addr,
int shm***)
;
引數shm_id是由shmget函式返回的共享記憶體標識。
引數shm_addr指定共享記憶體連線到當前程序中的位址位置,通常為空,表示讓系統來選擇共享記憶體的位址。
引數shm_***是一組標誌位,通常為0。
呼叫成功時返回乙個指向共享記憶體第乙個位元組的指標,如果呼叫失敗返回-1.
該函式用於將共享記憶體從當前程序中分離,相當於shmat函式的反操作。它的宣告如下:
int
shmdt
(const
void
*shmaddr)
;
引數shmaddr是shmat函式返回的位址。
呼叫成功時返回0,失敗時返回-1.
刪除共享記憶體,它的宣告如下:
int
shmctl
(int shm_id,
int command,
struct shmid_ds *buf)
;
引數shm_id是shmget函式返回的共享記憶體識別符號。
引數command填ipc_rmid。
引數buf填0。
解釋一下,shmctl是控制共享記憶體的函式,其功能不只是刪除共享內容,但其它的功能沒什麼用,所以不介紹了。
注意,用root建立的共享記憶體,不管建立的許可權是什麼,普通使用者無法刪除。
示例(book258.cpp)
/*
* 程式名:book258.cpp,此程式用於演示共享記憶體的用法
*/#include
#include
#include
#include
#include
intmain()
char
*ptext=0;
// 用於指向共享記憶體的指標
// 將共享記憶體連線到當前程序的位址空間,由ptext指標指向它
ptext =
(char*)
shmat
(shmid,0,
0);// 操作本程式的ptext指標,就是操作共享記憶體
printf
("寫入前:%s\n"
,ptext)
;sprintf
(ptext,
"本程式的程序號是:%d"
,getpid()
);printf
("寫入後:%s\n"
,ptext)
;// 把共享記憶體從當前程序中分離
shmdt
(ptext)
;// 刪除共享記憶體
// if (shmctl(shmid, ipc_rmid, 0) == -1)
// }
執行效果
注意,程式第一次執行的時候,共享記憶體未建立,所以第一次執行程式的時候,共享記憶體中的內容為空。之後程式每次執行都能獲取到上一次程式執行寫入的內容。
用ipcs -m可以檢視系統的共享記憶體,內容有鍵值(key),共享記憶體編號(shmid),建立者(owner),許可權(perms),大小(bytes)。
用ipcrm -m 共享記憶體編號,可以手工刪除共享記憶體,如下:
Linux 共享記憶體
一 概念 共享記憶體是被多個程序共享的一部分物理記憶體,是程序間共享資料的最快的一種方法。二 實現 分為兩個步驟 1 建立共享記憶體。2 對映共享記憶體。1 建立 int shmget key t key,int size,int shm 當key的取值為 ipc private 時,將建立一塊新的...
linux共享記憶體
linux共享記憶體使用 標頭檔案 include 1 建立共享記憶體 int shmget key t key,size t size,int shm 建立成功以後會返回乙個共享記憶體id,建立失敗返回 1。2 獲取共享記憶體 void shmat int shmid,const void shm...
linux 共享記憶體
共享記憶體解決的問題是 任意兩個程序之間的通訊如果是有名管道,是沒有辦法對管道中間的資料獲取讀和寫操作的,只能是兩段的資料,那麼如何對所有的資料進行操作 共享記憶體 共享記憶體也是通過核心來完成 命令 ipcs m p s 共享記憶體的工作機制如下所示 首先linux系統執行的每乙個程式,都是乙個程...