利用共享記憶體(share memory)可以讓我們在任意兩個程序之間傳遞資料,而且也是相對容易實現的一種方法,在正常情況下,乙個程序所使用的記憶體是不允許其它程序訪問的,但是通過共享記憶體可以實現資料的共享。
使用共享記憶體用到的api函式有:
# include
#include
#include
key_t ftok(const char *pathname, int proj_id)
其中pathname為當前程序的程式名,第二個引數為程序所開闢的第幾個共享記憶體,返回乙個key_t值,用於共享記憶體的獲取使用。
int shmget(key_t shmkey, int shmsiz, int flag)
void *shmat(int shmid, char *shmaddr, int shmflag)
int shmdt(char *shmaddr)
shmget是用來建立或者指向一塊共享記憶體的函式,其中shmkey是共享記憶體的識別符號,如果父子關係的程序間通訊的話,這個標識用ipc_private替代,如果沒有任何關係,可以使用ftok計算出來;shmsiz是這塊記憶體的大小;flag是這塊記憶體的模式和許可權標識(ipc_creat, ipc_alloc, ipc_excl,0666許可權)。函式成功返回共享記憶體的shmid,否則返回-1表示失敗。
shmat用來允許程序訪問共享記憶體的函式,其中shmid是共享記憶體的id,shmaddr是共享記憶體起始位置,shmflag是本程序對記憶體操作模式,shm_rdonly是唯讀模式,成功返回共享記憶體的起始位置。
shmdt與shmat相反,是用來禁止程序訪問一塊共享記憶體的函式。
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
其中shmid是共享記憶體的id,cmd是控制命令(ipc_stat, ipc_set, ipc_rmid),struct shmid_ds *buf是乙個結構體指標,如果要改變共享記憶體的狀態,使用它來指定,獲得狀態就存放在這個結構體中。
上述api函式的詳細說明請使用man(男人)檢視:
# man shmget | shmat | shmdt | shmctl
下面使用乙個簡單的例子說明如何使用共享記憶體。
// sharememcut.c 拷貝使用者輸入的字串到共享記憶體中
#include
#include
#include
#include
int main()
key_t shmkey;
int shmid, in_tmp;
char *head, *pos, in_data[4096], *in_ptr;
// create share memory key
shmkey = ftok("sharememcut", 1);
// get the share memory id
shmid = shmget(shmkey, sizeof(in_data), ipc_creat | 0666);
// allow the process to access share memory, and get the address
head = pos = shmat(shmid, 0, 0);
in_ptr = in_data;
// receive the character from stdin, 'q' to quit
while ((in_tmp = getchar()) != 'q') {
*in_ptr = in_tmp;
in_ptr++;
*in_ptr = '\0';
in_ptr = in_data;
// cut the data into share memory
while (*in_ptr != '\0') {
*pos++ = *in_ptr++;
// prohabit the process to access share memory
shmdt(head);
return 0;
# gcc -o sharememcut sharememcut.c 編譯sharememcut.c
# ./sharememcut 執行sharememcut建立共享記憶體
# ipcs -m | grep 4096 檢視建立的共享記憶體
0x01068288 348848145 root 666 4096 0
// sharemempaste.c 將共享記憶體的內容顯示在螢幕上並且刪除共享記憶體
#include
#include
#include
#include
int main()
key_t shmkey;
int shmid;
char *head, *pos, out_data[4096], *out_ptr;
// create share memory key
shmkey = ftok("sharememcut", 1);
// get the share memory id
shmid = shmget(shmkey, sizeof(out_data), 0666);
if (shmid == -1)
return -1;
// allow the process to access share memory, and get the address
head = pos = shmat(shmid, 0, 0);
out_ptr = out_data;
// get the data from share memory
while (*pos != '\0') {
*out_ptr++ = *pos++;
*out_ptr = '\0';
// output the data into stdout
printf("%s\n", out_data);
fflush(stdout);
// prohabit the process to access share memory
shmdt(head);
// delete the share memory
shmctl(shmid, ipc_rmid, null);
return 0;
# gcc -o sharemempaste sharemempaste.c 編譯sharemempaste.c
# ./sharemempaste 執行程式顯示共享記憶體的內容
陷阱請參考:
Linux程式設計 共享記憶體
共享記憶體簡介 1 共享記憶體 不相關的程序訪問同乙個邏輯記憶體 2 程序將同一段共享記憶體對映到自己的位址空間中 3 對共享記憶體訪問的同步控制必須由程式設計師來負責 基本函式 共享記憶體相關函式標頭檔案 include 建立或者獲取共享記憶體,都是通過它實現 int shmget key t k...
Linux環境下共享記憶體
共享記憶體指 shared memory 在多處理器的計算機系統中,可以被不同 處理 cpu 訪問的大容量記憶體。由於多個cpu需要快速訪問 儲存器,這樣就要對 儲存器進行 快取 cache 任何乙個快取的資料被更新後,由於其他處理器也可能要訪問,共享記憶體就需要立即更新,否則不同的處理器可能用到不...
Linux 共享記憶體
一 概念 共享記憶體是被多個程序共享的一部分物理記憶體,是程序間共享資料的最快的一種方法。二 實現 分為兩個步驟 1 建立共享記憶體。2 對映共享記憶體。1 建立 int shmget key t key,int size,int shm 當key的取值為 ipc private 時,將建立一塊新的...