資源描述:
《實(shí)驗(yàn)六 進(jìn)程通信--共享內(nèi)存.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、實(shí)驗(yàn)六進(jìn)程通信——共享內(nèi)存實(shí)驗(yàn)?zāi)康模?.了解Linux系統(tǒng)的進(jìn)程間通信機(jī)構(gòu)(IPC);2.理解Linux關(guān)于共享內(nèi)存的概念;3.掌握Linux支持進(jìn)程間內(nèi)存共享的系統(tǒng)調(diào)用;4.鞏固進(jìn)程同步概念。實(shí)驗(yàn)內(nèi)容:實(shí)現(xiàn)利用共享內(nèi)存機(jī)制的生產(chǎn)者/消費(fèi)者問(wèn)題的解決方案。生產(chǎn)者將數(shù)據(jù)寫(xiě)入共享內(nèi)存。消費(fèi)者從共享內(nèi)存取出數(shù)據(jù),在屏幕輸出。實(shí)驗(yàn)步驟:(一)共享內(nèi)存調(diào)試運(yùn)行圖1關(guān)于共享內(nèi)存的程序代碼。程序執(zhí)行內(nèi)容依次如下:1.首先調(diào)用shmget()函數(shù)建立一塊共享內(nèi)存,大小為1024個(gè)字節(jié),該函數(shù)返回創(chuàng)建的共享內(nèi)存的標(biāo)識(shí)符。2.然后調(diào)用fork產(chǎn)生一個(gè)子進(jìn)程(生產(chǎn)者進(jìn)程)。子
2、進(jìn)程調(diào)用shmat()函數(shù)將該共享內(nèi)存連接(attach)到自己的虛存空間,即可通過(guò)普通的內(nèi)存寫(xiě)操作(例如strcpy等),在該共享內(nèi)存寫(xiě)入數(shù)據(jù)。3.寫(xiě)完數(shù)據(jù)后,子進(jìn)程調(diào)用shmdt()函數(shù)斷開(kāi)與該共享內(nèi)存的連接。4.父進(jìn)程sleep,直到子進(jìn)程完成上述操作。父進(jìn)程(消費(fèi)者)調(diào)用shmctl()函數(shù)得到關(guān)于這塊共享內(nèi)存的相關(guān)信息,并打印出來(lái)。5.父進(jìn)程調(diào)用shmat()函數(shù)將這塊共享內(nèi)存連接到自己的虛存空間,即可通過(guò)普通的內(nèi)存讀操作(例如printf等),將該共享內(nèi)存中的字符串讀出來(lái)。6.讀完數(shù)據(jù)后,父進(jìn)程調(diào)用shmdt()函數(shù)斷開(kāi)與該共享內(nèi)存的連接。7
3、.最后,父進(jìn)程調(diào)用shmctl()函數(shù),銷(xiāo)毀該共享內(nèi)存。#include#include#include#include#defineKEY1234/*鍵*/#defineSIZE1024/*欲建立的共享內(nèi)存的大小*/intmain(){intshmid;char*shmaddr;structshmid_dsbuf;shmid=shmget(KEY,SIZE,IPC_CREAT
4、0600);/*建立共享內(nèi)存*/if(shmid==-1){printf("createshar
5、ememoryfailed:%s",strerror(errno));return0;}if(fork()==0){/*子進(jìn)程*/sleep(2);shmaddr=(char*)shmat(shmid,NULL,0);/*系統(tǒng)自動(dòng)選擇一個(gè)地址連接*/if(shmaddr==(void*)-1){printf("connecttothesharememoryfailed:%s",strerror(errno));return0;}/*向共享內(nèi)存內(nèi)寫(xiě)數(shù)據(jù)*/strcpy(shmaddr,"hello,thisisshareddata.");shmdt(s
6、hmaddr);/*斷開(kāi)共享內(nèi)存*/exit(0);}else{/*父進(jìn)程*/wait(0);shmctl(shmid,IPC_STAT,&buf);/*取得共享內(nèi)存的相關(guān)信息*/printf("sizeofthesharememory:shm_segsz=%dbytes",buf.shm_segsz);printf("processidofthecreator:shm_cpid=%d",buf.shm_cpid);printf("processidofthelastoperator:shm_lpid=%d",buf.shm_lpid);sh
7、maddr=(char*)shmat(shmid,NULL,0);/*系統(tǒng)自動(dòng)選擇一個(gè)地址連接*/if(shmaddr==(void*)-1){printf("connectthesharememoryfailed:%s",strerror(errno));return0;}printf("printthecontentofthesharememory:");printf("%s",shmaddr);shmdt(shmaddr);/*斷開(kāi)共享內(nèi)存*//*當(dāng)不再有任何其它進(jìn)程使用該共享內(nèi)存時(shí)系統(tǒng)將自動(dòng)銷(xiāo)毀它*/shmctl(shmid,IPC_RMID
8、,NULL);}}圖1共享內(nèi)存回答下面問(wèn)題:1.編譯連接通過(guò)后,運(yùn)行程序并查看運(yùn)行結(jié)果。(用截圖方式說(shuō)明)2.請(qǐng)說(shuō)明SyetemV使用共享內(nèi)存的步驟,并分別說(shuō)明系統(tǒng)調(diào)用shmget(),shmat(),shmdt()和shmctl()的功能和使用方法。SyetemV使用共享內(nèi)存的步驟:1.開(kāi)辟一塊共享內(nèi)存shmget()2.允許本進(jìn)程使用共某塊共享內(nèi)存shmat()3.數(shù)據(jù)寫(xiě)入/讀出4.禁止本進(jìn)程使用這塊共享內(nèi)存shmdt()5.刪除這塊共享內(nèi)存shmctl()或者命令行下ipcrm。1)函數(shù)原型:intshmget(key_tshmkey,intshm
9、siz,intflag);作用:shmget()是用來(lái)開(kāi)辟/指向一塊共享內(nèi)存的函