Linux學習筆記之共享記憶體

2021-10-06 11:20:34 字數 2373 閱讀 8153

共享記憶體物件:(shm)

操作框架:

key值==》申請物件==》掛載物件==》讀寫物件==》解除安裝物件 ==》刪除物件

shmget() shmat() 記憶體讀寫 shmdt() shmctl()

1、申請物件

#include

#include

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

功能:該函式使用公共key值向核心提出共享記憶體使用申請;

引數: key 唯一鍵值

size 要申請的共享記憶體大小

shm*** 申請方式和許可權,第一次 ipc_creat

判斷是否存在用 ipc_excl;

返回值:成功 返回乙個有效的shmid表示訊息佇列物件id

失敗 -1;

2、掛載物件(對映物件)

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

功能:該函式可以將已經申請成功的共享記憶體掛載到本地程序的

私有空間位址上。

引數: shmid 共享記憶體id

shmaddr 當前程序的可讀寫、空閒、同等大小 的記憶體掛載位址;

null 表示由系統自動查詢合適區域並掛載;

shm*** 掛載到本地的記憶體讀寫許可權;

返回值:成功 返回已經掛載成功的本地記憶體

失敗 null

練習:使用共享記憶體完成 父子程序間的 數字 字串 結構體 三種

不同資料資訊的程序間通訊;

4、解除安裝共享記憶體 ( 斷開對映 )

int shmdt(const void *shmaddr);

功能:該函式用於解除安裝之前已經掛載的共享記憶體;

引數:shmaddr 要斷開的位址

返回值:成功 0

失敗 -1;

注意:使用完畢盡量將指標歸零 shmaddr = null;

5、刪除共享記憶體

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

功能:該函式用於修改共享記憶體的屬性,可以用於刪除共享記憶體;

引數:shmid 共享記憶體id

cmd ipc_rmid 表示刪除共享記憶體物件

buf null 表示屬性不做調整;

返回值:成功 0

失敗 -1;

//共享記憶體寫記憶體

#include

#include

#include

#include

#include

struct shmbuf

;int

main()

int shmid;

struct shmbuf *shm;if(

(shmid=

shmget

(key,

512,ipc_creat|ipc_excl|

0664))

<0)

else}if

((shm=

shmat

(shmid,

null,0

))!=null

)//寫記憶體

shm->a=10;

shm->b=

'q';if(

shmdt

(shm)

<0)

system

("ipcs -m");

return0;

}

//共享記憶體讀記憶體

#include

#include

#include

#include

#include

struct shmbuf

;int

main()

int shmid;

struct shmbuf *shm;if(

(shmid=

shmget

(key,

512,ipc_creat|ipc_excl|

0664))

<0)

else}if

((shm=

shmat

(shmid,

null,0

))!=null

)//讀記憶體

printf

("a=%d b=%c\n"

,shm->a,shm->b);if

(shmdt

(shm)

<0)

shmctl

(shmid,ipc_rmid,

null);

system

("ipcs -m");

return0;

}

linux筆記之共享記憶體

1.程序間通訊的三種方法 2.共享記憶體的優點 執行時省去了若干次拷貝,是以上三種程式間通訊中最快的 3.共享記憶體的缺點 訊息佇列 管道等自帶同步或互斥機制,而共享記憶體不自帶,故需要使用訊號量來實現共享記憶體的互斥和同步。1.建立共享記憶體 int creat shm int size 建立 呼...

學習筆記之共享記憶體

共享記憶體 共享記憶體是程序間通訊方式中效率最高的一種,因為程序可以對記憶體進行直接讀寫,而沒有複製等其他操作,共享記憶體在核心中被建立,用時對映在使用者空間,在使用者空間操作。由於多個程序可同時訪問共享記憶體,因此需要同步和互斥機制配合使用 一 函式介面 申請key值,除建立共享記憶體以外的程序需...

linux學習筆記17 linux共享記憶體使用

共享記憶體的使用也是ipc的一種方式,這種方式資料拷貝次數較少,效率較高。其原理也是在記憶體中開闢一塊公共訪問的區域,可以讓各個程序連線讀寫。共享記憶體的api函式主要有以下四個 int shmget key t key,size t size,int shm 建立或加入共享記憶體 key t ke...