System V 共享記憶體

2021-07-02 19:15:20 字數 2576 閱讀 9455

一.共享記憶體資料結構

對於每個共享記憶體區,核心維護如下資訊結構,定義在, 在ubuntu中路徑:/usr/include/linux/shm.h

二. system v共享記憶體函式:

#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);

(1)功能:用來建立共享記憶體

原型 int shmget(key_t key, size_t size,

int shm***);

引數:

key:這個共享記憶體段名字

size: 共享記憶體大小

shm***: 由九個許可權標誌構成,它們的用法和建立檔案時使用的mode模式標誌是一樣的

返回值:    成功返回乙個非負整數,即該共享記憶體段的標識碼;

失敗返回-1

(2)功能:將共享記憶體段連線到程序位址空間

原型void *shmat(int shmid, const void *shmaddr, int shm***);

引數shmid:   共享記憶體標識

shmaddr: 指定連線的位址

shm***:  它的兩個可能取值是shm_rnd和shm_rdonly

返回值:成功返回乙個指標,指向共享記憶體第乙個位元組;失敗返回-1

shmaddr 為null,核心自動選擇乙個位址

shmaddr 不為null且shm***無shm_rnd標記,則以shmaddr為連線位址。

shmaddr不為null且shm***設定了shm_rnd標記,則連線的位址會自動向下調整為shmlba的整數倍。

公式:shmaddr - (shmaddr % shmlba)    # shmlba為4096

shm***=shm_rdonly,表示連線操作用來唯讀共享記憶體

(3)功能:將共享記憶體段與當前程序脫離

原型 int shmdt(const void *shmaddr);

引數shmaddr: 由shmat所返回的指標

返回值:成功返回0;失敗返回-1

注意:將共享記憶體段與當前程序脫離不等於刪除共享記憶體段

(4)功能:用於控制共享記憶體

原型 int shmctl(int shmid, int cmd, struct shmid_ds *buf);

引數shmid: 由shmget返回的共享記憶體標識碼

cmd:   將要採取的動作(有三個可取值)

buf:    指向乙個儲存著共享記憶體的模式狀態和訪問許可權的資料結構

返回值:成功返回0;失敗返回-1

cmd 的取值如下,與訊息佇列類似:

ipc_stat 把shmid_ds結構中的資料設定為共享記憶體的當前關聯值

ipc_set   在程序有足夠許可權的前提下,把共享記憶體的當前關聯值設定為shmid_ds資料結構中給出的值

ipc_rmid 刪除共享記憶體段

shmwrite.c

#include#include#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)

//sleep(10);

shmdt(p);//將共享記憶體段與當前程序脫離

shmctl(shmid,ipc_rmid,null);

return 0;

}

shmread.c

#include#include#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

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

System V共享記憶體

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 ...