共享記憶體函式
共享記憶體函式由shmget、shmat、shmdt、shmctl四個函式組成。
shmat
shmat(把共享記憶體區物件對映到呼叫程式的地址空間)
|
||
所需標頭檔案
|
#include <sys/types.h>
#include <sys/shm.h>
|
|
函式說明
|
連線共享記憶體識別符號為shmid的共享記憶體,連線成功後把共享記憶體區物件對映到呼叫程式的地址空間,隨後可像本地空間一樣訪問
|
|
函式原型
|
void *shmat(int shmid, const void *shmaddr, int shmflg)
|
|
函式傳入值
|
msqid
|
共享記憶體識別符號
|
shmaddr
|
指定共享記憶體出現在程式記憶體地址的什麼位置,直接指定為NULL讓核心自己決定一個合適的地址位置
|
|
shmflg
|
SHM_RDONLY:為只讀模式,其他為讀寫模式
|
|
函式返回值
|
成功:附加好的共享記憶體地址
|
|
出錯:-1,錯誤原因存於error中
|
||
附加說明
|
fork後子程式繼承已連線的共享記憶體地址。exec後該子程式與已連線的共享記憶體地址自動脫離(detach)。程式結束後,已連線的共享記憶體地址會自動脫離(detach)
|
|
錯誤程式碼
|
EACCES:無許可權以指定方式連線共享記憶體
EINVAL:無效的引數shmid或shmaddr
ENOMEM:核心記憶體不足
|
編輯本段其他共享記憶體函式
shmget函式原型
shmget(得到一個共享記憶體識別符號或建立一個共享記憶體物件)
|
||
所需標頭檔案
|
#include <sys/ipc.h>
#include <sys/shm.h>
|
|
函式說明
|
得到一個共享記憶體識別符號或建立一個共享記憶體物件並返回共享記憶體識別符號
|
|
函式原型
|
int shmget(key_t key, size_t size, int shmflg)
|
|
函式傳入值
|
key
|
0(IPC_PRIVATE):會建立新共享記憶體物件
|
大於0的32位整數:視引數shmflg來確定操作。通常要求此值來源於ftok返回的IPC鍵值
|
||
size
|
大於0的整數:新建的共享記憶體大小,以位元組為單位
|
|
0:只獲取共享記憶體時指定為0
|
||
shmflg
|
0:取共享記憶體識別符號,若不存在則函式會報錯
|
|
IPC_CREAT:當shmflg&IPC_CREAT為真時,如果核心中不存在鍵值與key相等的共享記憶體,則新建一個共享記憶體;如果存在這樣的共享記憶體,返回此共享記憶體的識別符號
|
||
IPC_CREAT|IPC_EXCL:如果核心中不存在鍵值與key相等的共享記憶體,則新建一個訊息佇列;如果存在這樣的共享記憶體則報錯
|
||
函式返回值
|
成功:返回共享記憶體的識別符號
|
|
出錯:-1,錯誤原因存於error中
|
||
附加說明
|
上述shmflg引數為模式標誌引數,使用時需要與IPC物件存取許可權(如0600)進行|運算來確定訊號量集的存取許可權
|
|
錯誤程式碼
|
EINVAL:引數size小於SHMMIN或大於SHMMAX
EEXIST:預建立key所指的共享記憶體,但已經存在
EIDRM:引數key所指的共享記憶體已經刪除
ENOSPC:超過了系統允許建立的共享記憶體的最大值(SHMALL)
ENOENT:引數key所指的共享記憶體不存在,而引數shmflg未設IPC_CREAT位
EACCES:沒有許可權
ENOMEM:核心記憶體不足
|
在Linux環境中,對開始申請的共享記憶體空間進行了初始化,初始值為0x00。
如果用shmget建立了一個新的訊息佇列物件時,則shmid_ds結構成員變數的值設定如下:
Ÿ shm_lpid、shm_nattach、shm_atime、shm_dtime設定為0。
Ÿ msg_ctime設定為當前時間。
Ÿ shm_segsz設成建立共享記憶體的大小。
Ÿ shmflg的讀寫許可權放在shm_perm.mode中。
Ÿ shm_perm結構的uid和cuid成員被設定成當前程式的有效使用者ID,gid和cuid成員被設定成當前程式的有效組ID。
shmdt函式原型
shmdt(斷開共享記憶體連線)
|
|
所需標頭檔案
|
#include <sys/types.h>
#include <sys/shm.h>
|
函式說明
|
與shmat函式相反,是用來斷開與共享記憶體附加點的地址,禁止本程式訪問此片共享記憶體
|
函式原型
|
int shmdt(const void *shmaddr)
|
函式傳入值
|
shmaddr:連線的共享記憶體的起始地址
|
函式返回值
|
成功:0
|
出錯:-1,錯誤原因存於error中
|
|
附加說明
|
本函式呼叫並不刪除所指定的共享記憶體區,而只是將先前用shmat函式連線(attach)好的共享記憶體脫離(detach)目前的程式
|
錯誤程式碼
|
EINVAL:無效的引數shmaddr
|
shmctl函式原型
shmctl(共享記憶體管理)
|
||
所需標頭檔案
|
#include <sys/types.h>
#include <sys/shm.h>
|
|
函式說明
|
完成對共享記憶體的控制
|
|
函式原型
|
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
|
|
函式傳入值
|
msqid
|
共享記憶體識別符號
|
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:識別符號為msqid的共享記憶體已被刪除
EINVAL:無效的引數cmd或shmid
EPERM:引數cmd為IPC_SET或IPC_RMID,卻無足夠的許可權執行
|
ftok函式
系統建立IPC通訊 (訊息佇列、訊號量和共享記憶體) 時必須指定一個ID值。通常情況下,該id值通過ftok函式得到。相關文章
- fork函式中的記憶體複製和共享函式記憶體
- php實現共享記憶體程式通訊函式之_shmPHP記憶體函式
- 共享記憶體記憶體
- 常用記憶體操作函式記憶體函式
- Golang 共享記憶體Golang記憶體
- POSIX共享記憶體記憶體
- oracle 共享記憶體Oracle記憶體
- POSIX 共享記憶體記憶體
- Delphi 的記憶體操作函式(5): 複製記憶體記憶體函式
- 手撕記憶體操作函式記憶體函式
- Golang記憶體分配內建函式之new函式Golang記憶體函式
- nginx共享記憶體分析Nginx記憶體
- QT之共享記憶體QT記憶體
- shmget() -- 建立共享記憶體記憶體
- SGA與共享記憶體記憶體
- linux共享記憶體Linux記憶體
- 核心記憶體分配常用函式使用記憶體函式
- windows記憶體管理和API函式Windows記憶體API函式
- 自動共享記憶體管理 自動記憶體管理 手工記憶體管理記憶體
- Qt共享記憶體QSharedMemoryQT記憶體
- Linux共享記憶體(二)Linux記憶體
- 修改/dev/shm共享記憶體dev記憶體
- 共享記憶體分段問題記憶體
- SGA與共享記憶體2記憶體
- php簡單使用shmop函式建立共享記憶體減少伺服器負載PHP函式記憶體伺服器負載
- 虛擬函式的記憶體佈局(上)函式記憶體
- 【記憶體管理】Oracle如何使用ASMM自動共享記憶體管理記憶體OracleASM
- nginx中共享記憶體的使用Nginx記憶體
- 程式間通訊---共享記憶體記憶體
- Linux共享記憶體的管理Linux記憶體
- 共享記憶體相關(ipcs/ipcrm)記憶體
- aix 共享記憶體段大小限制AI記憶體
- linux共享記憶體段研究Linux記憶體
- aix 共享記憶體段問題AI記憶體
- 第8章 管理共享記憶體記憶體
- UNIX共享記憶體的程式(轉)記憶體
- 函式指標、回撥函式、動態記憶體分配、檔案操作函式指標記憶體
- 胡扯JS系列-記憶體模型和函式執行JS記憶體模型函式