System V共享記憶體

2021-08-25 08:30:11 字數 2462 閱讀 4339

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模式標誌是...