共享記憶體物件:(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...