linux中的共享記憶體

2021-07-24 10:33:20 字數 3683 閱讀 3175

int main()  

shm = shmat(shmid, (void*)0, 0);

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

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

shared = (struct shared_use_st*)shm;

while(running)

else

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

running = 0;

}if(shmdt(shm) == -1)

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

exit(exit_success);

}}

struct shared_use_st  

; int main()

shm = shmat(shmid, 0, 0);

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

shared = (struct shared_use_st*)shm;

while(running)

else

sleep(1);

} if(shmdt(shm) == -1)

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

exit(exit_success);

}

shmget函式原型

shmget(得到乙個共享記憶體識別符號或建立乙個共享記憶體物件)

所需標頭檔案

#include 

#include

函式說明

得到乙個共享記憶體識別符號或建立乙個共享記憶體物件並返回共享記憶體識別符號

函式原型

int shmget(key_t key, size_t size, int shm***)

函式傳入值

keysize

大於0的整數:新建的共享記憶體大小,以位元組為單位

0:只獲取共享記憶體時指定為0

shm***

0:取共享記憶體識別符號,若不存在則函式會報錯

ipc_creat:當shm***&ipc_creat為真時,如果核心中不存在鍵值與key相等的共享記憶體,則新建乙個共享記憶體;如果存在這樣的共享記憶體,返回此共享記憶體的識別符號

ipc_creat|ipc_excl:如果核心中不存在鍵值 與key相等的共享記憶體,則新建乙個共享記憶體;如果存在這樣的共享記憶體則報錯

函式返回值

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

出錯:-1,錯誤原因存於error中

附加說明

上述shm***引數為模式標誌引數,使用時需要與ipc物件訪問許可權(如0600)進行|運算來確定訊號量集的訪問許可權

錯誤**

einval:引數size小於shmmin或大於shmmax

eexist:預建立key所指的共享記憶體,但已經存在

eidrm:引數key所指的共享記憶體已經刪除

enospc:超過了系統允許建立的共享記憶體的最大值(shmall)

enoent:引數key所指的共享記憶體不存在,而引數shm***未設ipc_creat位

eacces:沒有許可權

enomem:核心記憶體不足

在linux環境中,對開始申請的共享記憶體空間進行了初始化,初始值為0x00。

如果用shmget建立了乙個新的訊息佇列物件時,則shmid_ds結構成員變數的值設定如下:

shm_lpid、shm_nattach、shm_atime、shm_dtime設定為0。

msg_ctime設定為當前時間。

shm_segsz設成建立共享記憶體的大小。

shm***的讀寫許可權放在shm_perm.mode中。

shm_perm結構的uid和cuid成員被設定成當前程序的有效使用者id,gid和cuid成員被設定成當前程序的有效組id。

其他共享記憶體函式

shmat

shmat(把共享記憶體區物件對映到呼叫程序的位址空間)

所需標頭檔案

#include

#include

函式說明

連線共享記憶體識別符號為shmid的共享記憶體,連線成功後把共享記憶體區物件對映到呼叫程序的位址空間,隨後可像本地空間一樣訪問

函式原型

void *shmat(int shmid, const void *shmaddr, int shm***)

函式傳入值

shmid

共享記憶體識別符號

shmaddr

指定共享記憶體出現在程序記憶體位址的什麼位置,直接指定為null讓核心自己決定乙個合適的位址位置

shm***

shm_rdonly:為唯讀模式,其他為讀寫模式

函式返回值

附加說明

fork後子程序繼承已連線的共享記憶體位址。exec後該子程序與已連線的共享記憶體位址自動脫離(detach)。程序結束後,已連線的共享記憶體位址會自動脫離(detach)

錯誤**

eacces:無許可權以指定方式連線共享記憶體

einval:無效的引數shmid或shmaddr

enomem:核心記憶體不足

shmdt函式原型

shmdt(斷開共享記憶體連線)

函式說明

函式原int shmdt(const void *shmaddr)

入值函式返回值

成功:0

出錯:-1,錯誤原因存於error中

附加說明

本函式呼叫並不刪除所指定的共享記憶體區,而只是將先前用shmat函式連線(attach)好的共享記憶體脫離(detach)目前的程序

錯誤**

einval:無效的引數shmaddr

shmctl函式原型

shmctl(共享記憶體管理)

所需標頭檔案

#include 

#include

函式說明

完成對共享記憶體的控制

函式原型

int

shmctl(int shmid, int cmd, struct shmid_ds *buf)

函式傳入值

shmid

共享記憶體識別符號

cmdipc_stat:得到共享記憶體的狀態,把共享記憶體的shmid_ds結構複製到buf中

ipc_set:改變共享記憶體的狀態,把buf所指的shmid_ds結構中的uid、gid、mode複製到共享記憶體的shmid_ds結構內

ipc_rmid:刪除這片共享記憶體

buf共享記憶體管理結構體。具體說明參見共享記憶體核心結構定義部分

函式返回值

成功:0

出錯:-1,錯誤原因存於error中

錯誤**

eacces:引數cmd為ipc_stat,卻無許可權讀取該共享記憶體

efault:引數buf指向無效的記憶體位址

eidrm:識別符號為shmid的共享記憶體已被刪除

einval:無效的引數cmd或shmid

eperm:引數cmd為ipc_set或ipc_rmid,卻無足夠的許可權執行

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