共用記憶體方式:從實體記憶體裡面拿出來一部分作為多個進程共用。
共用記憶體是進程間共用資料的一種最快的方法,一個進程向共用記憶體地區寫入資料,共用這個記憶體的所有進程都可以立即看到其中內容。
共用記憶體實現步驟:
一、建立共用記憶體,使用shmget函數。
二、映射共用記憶體,將這段建立的共用記憶體映射到具體的進程空間去,使用shmat函數。
建立共用記憶體shmget:
intshmget(key_t key, size_t size, int shmflg)
功能:得到一個共用記憶體標識符或建立一個共用記憶體對象並返回共用記憶體標識符。
key: 0(IPC_PRIVATE)會建立共用記憶體對象
size:大於0的整數,建立共用記憶體的大小,以位元組為單位。只擷取共用記憶體時,指定為0.
shmflg:
0表示取共用記憶體標識符,如不存在則函數會報錯;
IPC_CREAT,如果核心中不存在索引值與key相等的共用記憶體時,則建立一個共用記憶體;如果存在這樣的共用記憶體則返回共用記憶體的標識符;
IPC_CREAT|IPC_EXCL: 如果核心中不存在索引值與key相等的共用記憶體,則建立一個訊息佇列;如果存在這樣的共用記憶體則報錯;
函數傳回值:成功則返回記憶體的標識符;出錯則返回-1,錯誤原因存在於error中
映射共用記憶體到調用進程的地址空間shmat:
void*shmat(int shmid, const void *shmaddr, int shmflg)
msqid:共用記憶體標識符
shmaddr:指定共用記憶體出現在進程記憶體位址的什麼位置,直接指定為NULL讓核心自己決定一個合適的地址位置。
shmflg: SHM_RDONLY 唯讀模式,其他為讀寫入模式
函數傳回值:成功則返回附加好的共用記憶體位址;出錯返回-1,錯誤原因存在於error中
斷開共用記憶體串連shmdt:
intshmdt(const void *shmaddr)
功能:傳入shmaddr,串連共用的記憶體起始地址;斷開成功則返回0,出錯則返回-1,錯誤原因存在於error中。
父子進程間通訊執行個體:
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv){
if(argc< 2){ //需要輸入共用的資料
printf("pleaseinput the shared data.n");
exit(-1);
}
intshmid;
shmid= shmget(0,1024,IPC_CREAT);
if(shmid== -1){ // 申請共用記憶體失敗
printf("createshare memory failed.n");
exit(-1);
}
if(fork()){ // 父進程之中
char*p_shmaddr;
p_shmaddr= shmat(shmid, NULL, 0); // 映射到父進程之中的一個地址
memset(p_shmaddr,0, 1024); // 初始化共用記憶體
strcpy(p_shmaddr,argv[1]); // 拷貝共用資料到共用記憶體
wait(NULL); //等待子進程結束
exit(0);
}
else{
sleep(2); //等待父進程寫入資料
char*c_shmaddr;
c_shmaddr= shmat(shmid,NULL,0); // 映射到子進程之中一個地址,具體由kernel 指配
printf("theshare data is: %sn", c_shmaddr); //子進程輸出共用的資料
exit(0);
}
}