Linux下共享記憶體程式設計

2021-08-26 02:08:09 字數 3276 閱讀 2017

利用共享記憶體(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 時,將建立一塊新的...