共享內(nèi)存可以說最有用的進程間通信方式,也是最快的IPC形式。兩個不同進程A,B共享內(nèi)存的意思是,同一塊物理內(nèi)存被映射到進程A,B各自的進程地址空間。進程A可以及時看到進程B對共享內(nèi)存中數(shù)據(jù)的更新,反之亦然 。由于多個進程共享同一塊內(nèi)存區(qū)域,必然需要某種同步機制 ,互斥鎖和信號量都可以。
創(chuàng)新互聯(lián)建站是網(wǎng)站建設(shè)專家,致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,專業(yè)領(lǐng)域包括網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、電商網(wǎng)站制作開發(fā)、重慶小程序開發(fā)、微信營銷、系統(tǒng)平臺開發(fā),與其他網(wǎng)站設(shè)計及系統(tǒng)開發(fā)公司不同,我們的整合解決方案結(jié)合了恒基網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結(jié)合,且不斷評估并優(yōu)化我們的方案,為客戶提供全方位的互聯(lián)網(wǎng)品牌整合方案!
采用共享內(nèi)存通信的一個顯而易見的好處是效率高,因為進程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝,對于管道和消息隊列等通信方式,則需要在內(nèi)核和用戶空間進行4次的數(shù)據(jù)拷貝,而共享內(nèi)存則只拷貝兩次數(shù)據(jù),一次從輸入文件到共享內(nèi)存區(qū),另一次從共享內(nèi)存區(qū)到輸出文件。實際上,進程之間在共享內(nèi)存時,并不總是讀寫少量數(shù)據(jù)后就解除映射,有新的通信時,再重新建立共享內(nèi)存區(qū)域。而是保持共享區(qū)域,直到通信完畢為止,這樣數(shù)據(jù)內(nèi)容一直保存在共享內(nèi)存中,并沒有寫回文件,共享內(nèi)存中的內(nèi)容是在解除映射時才寫回文件的。因此,采用共享內(nèi)存的效率是非常高的。
下面我們來寫一段程序來看看共享內(nèi)存的應(yīng)用:
comm.c文件:
#include "comm.h"
int comm_shm_creat(int flag)
{
key_t _key=ftok(_PATH_,_PROJ_ID_);
if(_key<0)
{
perror("ftok");
return -1;
}
int shm_id=shmget(_key,_SIZE_,flag);
if(shm_id<0)
{
perror("shmget");
return -1;
}
return shm_id;
}
int shm_creat()
{
umask(0);
int flag=IPC_CREAT|IPC_EXCL|0666;
return comm_shm_creat(flag);
}
int shm_get()
{
int flag=IPC_CREAT;
return comm_shm_creat(flag);
}
int shm_destroy(int shm_id)
{
if(shmctl(shm_id,IPC_RMID,NULL)<0)
{
perror("shmctl");
return -1;
}
return 0;
}
void* at_shm(int shm_id)
{
return shmat(shm_id,NULL,0);
}
int dt_shm(void *addr)
{
return shmdt(addr);
}
shm_server.c文件:
#include "comm.h"
int main()
{
int shm_id=shm_creat();
char *start=at_shm(shm_id);
int i=0;
for(;i<_SIZE_;++i)
{
printf("%s\n",start);
sleep(1);
}
dt_shm(start);
shm_destroy(shm_id);
return 0;
}
shm_client.c文件:
#include "comm.h"
int main()
{
int shm_id=shm_get();
char *start=at_shm(shm_id);
int i=0;
for(;i<_SIZE_;++i)
{
start[i]='A';
start[i+1]='\0';
sleep(1);
}
dt_shm(start);
return 0;
}
運行結(jié)果如下:
從上圖結(jié)果可以看到,他們shmget的ID相同,而且client寫的內(nèi)容被server接收到了,實現(xiàn)了進程間通信的目的。