Linux程序通訊共享記憶體函式

2021-07-11 18:13:04 字數 2739 閱讀 2795

共享記憶體函式由shmget、shmat、shmdt、shmctl四個函式組成。

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

所需標頭檔案

#include

#include

函式說明

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

函式原型

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

函式傳入值

key

0(ipc_private):會建立新共享記憶體物件

大於0的32位整數:視引數shm***來確定操作。通常要求此值**於ftok返回的ipc鍵值

size

大於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:核心記憶體不足

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

所需標頭檔案

#include

#include

函式說明

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

函式原型

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

函式傳入值

msqid

共享記憶體識別符號

shmaddr

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

shm***

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

函式返回值

成功:附加好的共享記憶體位址

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

附加說明

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

錯誤**

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

einval:無效的引數shmid或shmaddr

enomem:核心記憶體不足

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

所需標頭檔案

#include

#include

函式說明

與shmat函式相反,是用來斷開與共享記憶體附加點的位址,禁止本程序訪問此片共享記憶體

函式原型

int shmdt(const void *shmaddr)

函式傳入值

shmaddr:連線的共享記憶體的起始位址

函式返回值

成功:0

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

附加說明

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

錯誤**

einval:無效的引數shmaddr

shmctl(共享記憶體管理)

所需標頭檔案

#include

#include

函式說明

完成對共享記憶體的控制

函式原型

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

函式傳入值

shmid

共享記憶體識別符號

cmd

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

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

ipc_rmid:刪除這片共享記憶體

buf

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

函式返回值

成功:0

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

錯誤**

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

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

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

einval:無效的引數cmd或shmid

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

linux程序通訊 共享記憶體

共享記憶體是ipc機制中的第二個。他允許連個不相關的程序訪問同一塊邏輯記憶體,能夠有效地實現兩個程序間資料傳遞。int shmget key t key,sizr t size,int shm 建立共享記憶體 key為共享記憶體段的命名,size為以位元組為單位的記憶體容量,shm 包含9位元許可權...

Linux程序通訊 共享記憶體

對於linux來講,不同程序之間的記憶體是不能讀寫的,乙個程序只能讀寫自己所屬的記憶體。a程序是不能讀寫b程序記憶體的?如果程式確實想通過記憶體交換資料怎麼辦?linux提供共享記憶體機制。共享記憶體是由核心處於多個程序間交換資訊的目的而留出的一塊記憶體區 段 共享記憶體也需要設定相關許可權的。這段...

Linux程序通訊 共享記憶體

共享記憶體 共享記憶體是一種最為高效的程序間通訊方式,在程序間通訊時核心專門的留出一塊記憶體區。在這段記憶體區可以由訪問程序將其對映到自己的私有位址空間。因此程序就可以直接讀寫這一塊記憶體區,極大的提高了效率。共享記憶體的步驟 1 建立共享記憶體 2 對映貢獻記憶體 原理 相關函式 shmget 建...