實(shí)驗(yàn)六 進(jìn)程通信--共享內(nèi)存.doc

實(shí)驗(yàn)六 進(jìn)程通信--共享內(nèi)存.doc

ID:51647707

大小:94.00 KB

頁(yè)數(shù):7頁(yè)

時(shí)間:2020-03-14

實(shí)驗(yàn)六  進(jìn)程通信--共享內(nèi)存.doc_第1頁(yè)
實(shí)驗(yàn)六  進(jìn)程通信--共享內(nèi)存.doc_第2頁(yè)
實(shí)驗(yàn)六  進(jìn)程通信--共享內(nèi)存.doc_第3頁(yè)
實(shí)驗(yàn)六  進(jìn)程通信--共享內(nèi)存.doc_第4頁(yè)
實(shí)驗(yàn)六  進(jìn)程通信--共享內(nèi)存.doc_第5頁(yè)
資源描述:

《實(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)存的函

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。