LINUX共享記憶體

2021-07-23 22:08:43 字數 3181 閱讀 3027

共享記憶體允許兩個或多個程序共享給定的儲存區域。它是程序間共享資料最快的一種方法。通過共享記憶體,程序可以將一段記憶體連線到自己的儲存空間。所有程序都可以訪問共享記憶體中的資料,共享記憶體中的任何修改,所做的改動將立刻被可以訪問該段共享記憶體的程式看到。

共享記憶體並未給資料提供同步機制,所以常常需要使用其他機制來同步對共享記憶體的訪問,比如乙個程序在向共享記憶體寫資料,則應當使用一種機制保證其他的程式不會同時也去寫這些資料,保證資料之間的同步。

分為四個步驟,對應四個函式,分別是建立->對映->斷開->刪除。

描述:

建立或開啟一塊共享記憶體區,與 open 函式建立或開啟檔案的行為類似。

引數:

key: ipc 鍵值, key_t 型別, 用於標識當前系統的這個共享記憶體, 可以手動指定乙個整數,也可以通過 ftok 獲得。

size:該共享儲存段的長度(位元組)

shm***:標識函式的行為及共享記憶體的許可權,與 open 函式的第三個數一樣,可以指定以何種許可權開啟建立或開啟共享記憶體,並且,在共享記憶體不存在的時候,還可以通過以下兩個標誌來建立共享記憶體, 共享記憶體不具有可執行許可權。

ipc_creat:如果不存在就建立

ipc_excl:如果已經存在則返回失敗

成功:返回共享記憶體識別符號。

失敗:返回-1。

功能:

將乙個共享記憶體段對映到呼叫程序的資料段中。

引數:

shmid: 由 shmget 返回的共享記憶體識別符號。

shmaddr:共享記憶體對映位址(若為 null 則由系統自動指定),推薦使用 null。

shm***:共享記憶體段的訪問許可權和對映條件,可以有以下幾種,一般設為 0

0:共享記憶體具有可讀可寫許可權。

shm_rdonly:唯讀。

shm_rnd:( shmaddr 非空時才有效)沒有指定 shm_rnd 則此段連線到 shmaddr所指定的位址上(shmaddr 必需頁對齊)。指定了 shm_rnd 則此段連線到 shmaddr -shmaddr%shmlba 所表示的位址上。

功能:

將共享記憶體和當前程序分離(僅僅是斷開聯絡, 並不刪除共享記憶體)。

成功返回 0,失敗返回 -1。

功能:共享記憶體空間的控制。

引數:

shmid:共享記憶體識別符號。

cmd:函式功能的控制,可以有以下幾個。

ipc_rmid:刪除。

ipc_set:設定 shmid_ds 引數。

ipc_stat:儲存 shmid_ds 引數。

shm_lock:鎖定共享記憶體段(超級使用者)。

shm_unlock:解鎖共享記憶體段。

buf: shmid_ds 資料型別的位址,用來存放或修改共享記憶體的屬性,包括共享記憶體的權

限和所有者資訊,共享記憶體在占用了幾個段,建立者的 pid 等資訊。

成功返回 0,失敗返回 -1。

#include #include #include #include #include #define textsize 2048

struct shared_use_st

;int main(int argc, char const *argv)

//將共享記憶體連線到當前程序的位址空間

shm = shmat(shmid,null,0);

if(shm == (void*)-1)

//列印分配的記憶體位址

printf("memory attached at %x\n",(int)shm);

//設定共享記憶體

shared = (struct shared_use_st*)shm;

shared->written = 0;

while(running)

}else

sleep(1);

}//把共享記憶體從當前程序中分離

if(shmdt(shm) == -1)

//刪除共享記憶體

if(shmctl(shmid,ipc_rmid,0) == -1)

return 0;

}

#include #include #include #include #include #define textsize 2048

struct shared_use_st

;int main()

//將共享記憶體連線到當前程序的位址空間

shm = shmat(shmid,null,0);

if(shm == (void*)-1)

printf("memory attached at %x\n",(int)shm);

//設定共享記憶體

shared = (struct shared_use_st*)shm;

//向共享記憶體中寫入資料

while(running)

//寫入資料

printf("enter some text: ");

fgets(buffer,text_size,stdin);

strncpy(shared->text,buffer,text_size);

//寫完資料,設定writtrn使共享記憶體可讀

shared->written = 1;

if(strncmp(buffer, "end", 3) == 0)

running = 0;

}//把共享記憶體從當前程序中分離

if(shmdt(shm) == -1)

sleep(2);

return 0;

}

1、程式shmread建立共享記憶體,然後將它連線到自己的位址空間。在共享記憶體的開始處使用了乙個結構struct_use_st。該結構中有個標誌written,當共享記憶體中有其他程序向它寫入資料時,共享記憶體中的written被設定為0,程式等待。當它不為0時,表示沒有程序對共享記憶體寫入資料,程式就從共享記憶體中讀取資料並輸出,然後重置設定共享記憶體中的written為0,即讓其可被shmwrite程序寫入資料。

2、程式shmwrite取得共享記憶體並連線到自己的位址空間中。檢查共享記憶體中的written,是否為0,若不是,表示共享記憶體中的資料還沒有被完,則等待其他程序讀取完成,並提示使用者等待。若共享記憶體的written為0,表示沒有其他程序對共享記憶體進行讀取,則提示使用者輸入文字,並再次設定共享記憶體中的written為1,表示寫完成,其他程序可對共享記憶體進行讀操作。

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系統執行的每乙個程式,都是乙個程...