struct shmid_ds ;
#include #include int shmget(key_t key, size_t size, int shm***);
void *shmat(int shmid, const void *shmaddr, int shm***);
int shmdt(const void *shmaddr);
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:用來建立共享記憶體
int shmget(key_t key,size_t size,int shm***);
引數
key:這個共享記憶體段名字
size:共享記憶體大小
shm***:用法類似msgget中的msg***引數;
返回值:
成功返回乙個非負整數,即該共享記憶體段的標識碼,失敗返回-1
void *shmat(int shmid,const *shmaddr,int shm***);
連線到本程序位址空間, 成功連線之後, 而且如果這塊記憶體中有資料, 則就可以直接將其中的資料取出來
引數:shm***:一般指定為0, 表示可讀,可寫; 而它的另外兩個可能取值是shm_rnd和shm_rdonly(見下)
返回值:
成功返回乙個指標,指向共享記憶體起始位址;失敗返回(void *) -1
shmaddr與shm***組合說明
shmaddr為null
linux核心自動為程序連線到程序的記憶體(推薦使用)
shmaddr不為null且shm***無shm_rnd標記
以shmaddr為連線位址
shmaddr不為null且shm***設定了shm_rnd標記
連線的位址會自動向下調整為shmlba的整數倍;
公式:shmaddr - (shmaddr % shmlba)
shmlba為記憶體頁面的大小(4k)
shm***=shm_rdonly
表示連線只能用來讀共享記憶體,
功能:將共享記憶體段與當前程序脫離
int shmdt(const void *shmaddr);
引數
shmaddr:由shmat所返回的值
返回值:
成功返回0,失敗返回-1
注意:將共享記憶體與當前程序脫離不等於刪除共享記憶體段
功能:共享記憶體的控制函式
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
引數
shmid:由shmget返回的共享記憶體標識碼
cmd:將要採取的動作(有三個可取值)
buf:指向乙個儲存著共享記憶體的模式狀態和訪問許可權的資料結構(也就是動作命令帶的引數)
返回值:
成功返回0,失敗返回-1.
//共享記憶體寫
#include #include #include #include #include #include #include #include #include #include #include #include #define err_exit(m) \
do \
while(0)
typedef struct stu
stu;
int main(int argc,char *argv)
//斷開程序與共享記憶體區的連線
shmdt(p);
//從系統中刪除由shmid標識的共享記憶體區並拆除它
shmctl(shmid,ipc_rmid,null);
return 0;
}
#include #include #include #include #include #include #include #include #include #include #include #include #define err_exit(m) \
do \
while(0)
typedef struct stu
stu;
int main(int argc,char *argv)
system v共享記憶體小結:
1.共享記憶體被別的程式占用,則刪除該共享記憶體時,不會馬上刪除(引用計數計數);
2.此時會出現乙個現象:該共享記憶體的key變為0x00000000,變為私有;
3.此時還可以讀,但必須還有辦法獲取該共享記憶體的id(shmid),因為此時試圖通過該共享記憶體的key獲取該共享記憶體,是白費的
System V 共享記憶體
一.共享記憶體資料結構 對於每個共享記憶體區,核心維護如下資訊結構,定義在,在ubuntu中路徑 usr include linux shm.h 二.system v共享記憶體函式 include include int shmget key t key,size t size,int shm vo...
共享記憶體System V
system v 共享記憶體區 對於每個共享記憶體區,核心維護如下的資訊結構 obsolete,used only for backwards compatibility and libc5 compiles struct shmid ds struct shmid ds 共享記憶體操作api 0....
System V共享記憶體
標頭檔案 include include intshmget key t key,size t size,int shm 功能 用來建立共享記憶體 引數 a key 這個共享記憶體段名字 b size 共享記憶體大小 c shm 由幾個許可權標誌構成,他們的用法和建立檔案時使用的model模式標誌是...