Linux共享記憶體

2021-10-04 07:04:51 字數 2651 閱讀 5713

三、示例程式

四、其它的操作命令

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

"_public.h"

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