用mmap()共享內(nèi)存
接口:
void *mmap( void *start, size_t length, int port, int flags, int fd, off_t offset)正常返 回映射區(qū)的地址,出錯返回-1。
start 為映射區(qū)域的首地址,一般賦 值NULL通過系統(tǒng)自動分配。
length 為區(qū)域大小。
fd 為映射文件的文件描述符。
offset 為映 射文件的偏移,也就是從文件的offset處開始映射。
port : 映射 區(qū)域的屬性值,可取PORT_EXEC, PORT_READ, PORT_WRITE, PORT_NONE,四個值,分別 是區(qū)域內(nèi)可執(zhí)行、可讀、可寫和不可訪問。
flags : 映射文件屬 性值,可取 MAP_ANON, MAP_PRIVATE, MAP_SHARED,分別代表匿名映射,私有copy-on -write映射,和共享映射。
MAP_ANON映射只能實現(xiàn)父子進程的內(nèi)存共 享,因為只有父子進程有才有相同的映射后的地址空間,不同進程的內(nèi)存共享需要用 MAP_SHARED通過映射文件來實現(xiàn)。
值得一提的是,映射的初期并沒有 真正分配內(nèi)存,只有訪問頁面的時候,引發(fā)一個缺頁異常,這時才真正分配內(nèi)存。
示例a.c和b.c,先建立一個文件sharefile,內(nèi)容是”My name is Foo!”。
----a.c----
int main()
{
int fd;
char *prt;
char *msg="My name is Foo!";
fd=open("sharefile",O_RDWR,00777);
prt=(char*) mmap(NULL,strlen(msg)+1,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
memcpy(prt,msg,strlen(msg)+1);
printf("%s",prt);
sleep(10); /*等待b去修改共享內(nèi)存內(nèi)容。*/
printf("%s",prt);
munmap(prt,strlen(msg)+1);
return 0;
}----b.c----
int main()
{
int fd;
char *prt;
char *msg="My name is Bar!";
fd=open("sharefile",O_RDWR,00777);
prt=(char*) mmap(NULL,strlen(msg)+1,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
memcpy(prt,msg,strlen(msg)+1);
munmap(prt,strlen(msg));
return 0;
}運行./a 程序輸出:
My name is Foo!停止10s
My name is Foo!先運行./a, 然后切換另一個控制臺運行./b,切換回發(fā)現(xiàn)a的輸出變?yōu)椋?
My name is Foo!停止10s
My name is Bar!可見,a內(nèi) 存中的內(nèi)容被b修改了~最后的munmap函數(shù)會使得映射內(nèi)存中的內(nèi)容寫回文件中,所以 文件中的內(nèi)容也變成”My name is Bar!”。
參考資料: 1. 《Computer Systems - A Programmer's Perspective》 2.《Linux Programming by Example》
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
