1撵儿、共享內(nèi)存在內(nèi)核中是什么樣子的乘客?
它是一塊緩存,類似于用戶空間的數(shù)組或malloc函數(shù)分配的空間一樣统倒,只不過(guò)是在內(nèi)核空間寨典。
2、共享內(nèi)存的特點(diǎn)
共享內(nèi)存創(chuàng)建之后房匆,一直存在于內(nèi)核中,直到被刪除或系統(tǒng)關(guān)閉报亩;
共享內(nèi)存和管道不一樣浴鸿,讀取后,內(nèi)容仍在其共享內(nèi)存中弦追。
3岳链、 shmget函數(shù):打開(kāi)或創(chuàng)建共享內(nèi)存
shmget函數(shù)
例1:通過(guò)IPC_PRIVATE創(chuàng)建共享內(nèi)存
#include "sys/types.h"
#include "sys/shm.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
int main()
{
int shmid;
shmid = shmget(IPC_PRIVATE,128,0777);
if(shmid <0)
{
printf("creat share memory failure\n");
return -1;
}
printf("create share memory success, shmid=%d\n", shmid);
system("ipcs -m");
// system("ipcrm -m shmid");
return 0;
}
通過(guò)用戶空間的ipcs
命令,可以看到內(nèi)核空間的ipc對(duì)象劲件。
ipcs:查看ipc對(duì)象
ipcs -m:查看共享內(nèi)存
ipcs -q:查看消息隊(duì)列
ipcs -s:查看信號(hào)燈
ipcrm:刪除ipc對(duì)象
ipcrm -m ID號(hào):刪除共享內(nèi)存
ipcrm -q ID號(hào):刪除消息隊(duì)列
ipcrm -s ID號(hào):刪除信號(hào)燈
ipcrm -m ID號(hào)
例2:通過(guò)ftok的返回值創(chuàng)建共享內(nèi)存
4掸哑、 ftok:創(chuàng)建key值
char ftok(const char *path, char key)
參數(shù):第一個(gè)參數(shù):文件路徑和文件名约急;
第二個(gè)參數(shù):一個(gè)字符。
返回值:正確返回一個(gè)key值苗分,出錯(cuò)返回-1
IPC_PRIVATE操作時(shí)厌蔽,共享內(nèi)存的key值都一樣,都是0摔癣,所以使用ftok來(lái)創(chuàng)建key值奴饮。只要key值是一樣的,用戶空間的進(jìn)程通過(guò)這個(gè)函數(shù)打開(kāi)择浊,則會(huì)對(duì)內(nèi)核的同一個(gè)IPC對(duì)象操作戴卜。
5、shmat:將共享內(nèi)存映射到用戶空間的地址中
能不能用read ,write呢琢岩?
為了方便用戶空間對(duì)共享內(nèi)存的操作投剥,使用地址映射的方式。
void *shmat(int shmid, const void *shmaddr, int shmflg); //malloc
參數(shù):第一個(gè)參數(shù):ID號(hào)担孔;
第二個(gè)參數(shù):映射到的地址薇缅;NULL為系統(tǒng)自動(dòng)完成的映射;
第三個(gè)參數(shù)shmflg: SHM_RDONLY共享內(nèi)存只讀
默認(rèn)是0攒磨,表示共享內(nèi)存可讀寫(xiě)泳桦。
返回值:成功:映射后的地址;
失斆溏帧:NULL灸撰。
6、shmdt:將進(jìn)程(用戶空間)里的地址映射刪除拼坎。
int shmdt(const void *shmaddr);
參數(shù):shmaddr共享內(nèi)存映射后的地址
返回值:成功:0
出錯(cuò):-1
7浮毯、shmctl:刪除共享內(nèi)存對(duì)象(內(nèi)核)
函數(shù)原型:int shmctl(int shmid, int cmd, struct shmid_ds *buf);
函數(shù)參數(shù):shmid:要操作的共享內(nèi)存標(biāo)識(shí)符。
cmd : IPC_STAT (獲取對(duì)象屬性)--- 實(shí)現(xiàn)了命令ipcs -m
IPC_SET (設(shè)置對(duì)象屬性)
IPC_RMID (刪除對(duì)象) ---實(shí)現(xiàn)了命令ipcrm -m
buf :指定IPC_STAT/IPC_SET時(shí)用以保存/設(shè)置屬性泰鸡。
函數(shù)返回值:成功:0
出錯(cuò):-1