資源描述:
《共享內(nèi)存和信號(hào)量(進(jìn)程間通信)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、實(shí)驗(yàn)7共享內(nèi)存和信號(hào)量(進(jìn)程間通信)邢衛(wèi)2008-11-26修訂實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)并掌握Linux系統(tǒng)中的進(jìn)程間通信機(jī)制,包括共享內(nèi)存和信號(hào)量。實(shí)驗(yàn)內(nèi)容1.學(xué)習(xí)共享內(nèi)存相關(guān)的系統(tǒng)調(diào)用shmget(),shmat(),shmdt,shmctl()2.學(xué)習(xí)信號(hào)量(semaphore)相關(guān)的系統(tǒng)調(diào)用semget(),semop(),semctl()3.學(xué)習(xí)信號(hào)(signal)相關(guān)的系統(tǒng)調(diào)用signal(),atexit()等4.完成《邊干邊學(xué)》第6.4.1節(jié)的實(shí)驗(yàn)程序的編輯、編譯、運(yùn)行操作5.分析、學(xué)習(xí)實(shí)驗(yàn)程序的工作過程和原理6.選做:學(xué)習(xí)《邊干邊學(xué)》第6章,結(jié)合
2、使用聯(lián)機(jī)手冊(cè)(可以從man2ipc命令開始),編程練習(xí)各種進(jìn)程間通信機(jī)制實(shí)驗(yàn)步驟1.以stu帳號(hào)登錄2.編輯reader_writer1.c程序注意:在193頁delete()函數(shù)中,注意改成if(mysemctl(Semid,0,IPC_RMID,(unionsemun)0)==-1){限于實(shí)驗(yàn)的時(shí)間,該文件已預(yù)先存放在/home/stu/.kernel/lab6目錄下,可以直接使用。但每位同學(xué)務(wù)必通讀并理解該程序。登錄后,使用cd.kernel/lab6命令進(jìn)入該文件所在目錄,繼續(xù)以下實(shí)驗(yàn)步驟。3.編譯gccreader_writer1.c-ore
3、ader_writer14.運(yùn)行./reader_writer1注意記錄下共享內(nèi)存的id號(hào)5.使用Alt+F2切換到第2個(gè)登錄窗口,再次以stu帳號(hào)登錄可以使用who命令查看驗(yàn)證此時(shí)有兩個(gè)stu用戶已登錄可以使用ps–l命令查看這兩個(gè)stu用戶的進(jìn)程6.在第2個(gè)stu用戶窗口中,輸入./reader_writer1共享內(nèi)存的id號(hào)注意:此時(shí),第2個(gè)stu用戶窗口中的進(jìn)程擔(dān)當(dāng)writer角色,第1個(gè)stu用戶窗口中的進(jìn)程擔(dān)當(dāng)reader角色。7.在第2個(gè)窗口中,多次輸入信息;使用Alt+F1和Alt+F2在兩個(gè)窗口間切換,觀察你對(duì)writer的輸入,wr
4、iter已經(jīng)通過共享內(nèi)存?zhèn)鬟f給了reader。8.此時(shí),你還可以使用Alt+F3切換到第3個(gè)登錄窗口,并以stu帳號(hào)登錄可以使用who命令驗(yàn)證有3個(gè)stu用戶登錄;可以經(jīng)常性使用ps–l命令來查看另外兩個(gè)窗口中的進(jìn)程的狀態(tài)9.切換到writer窗口(第2個(gè)窗口),通過對(duì)writer的問題回答“2”,退出writer。切換到reader窗口(第1個(gè)窗口),通過Ctrl+C終止reader進(jìn)程。思考題1.同樣的源程序,reader和writer進(jìn)程是怎樣各自找到自己的定位的?2.reader和writer是怎樣通過信號(hào)量(semphore)實(shí)現(xiàn)同步的?wr
5、iter是如何得知這一對(duì)信號(hào)量的id的?3.數(shù)據(jù)是如何從writer傳遞到reader的?4.writer是如何得知共享內(nèi)存的id的?5.在reader中,是如何捕獲Ctrl-C信號(hào)(signal)的?捕獲后是如何處理的?6.一般來說,在Linux中使用共享內(nèi)存(sharedmemory)的流程應(yīng)該怎樣?使用哪些系統(tǒng)調(diào)用?7.一般來說,在Linux中使用信號(hào)量(semaphore)的流程應(yīng)該怎樣?使用哪些系統(tǒng)調(diào)用?8.這里的共享內(nèi)存,和使用帶CLONE_VM標(biāo)志的clone()系統(tǒng)調(diào)用創(chuàng)建的兩個(gè)task之間共享的內(nèi)存,有什么異同?參考資料l《邊干邊學(xué)》
6、(第1版)第6章,“共享內(nèi)存”n具體源程序和實(shí)驗(yàn)操作詳見6.4.1節(jié)附錄1共享內(nèi)存的使用共享內(nèi)存共有4個(gè)系統(tǒng)調(diào)用:shmget,shmat,shmdt,shmctlintshmget(key_tkey,intsize,intshmflg);典型的創(chuàng)建共享內(nèi)存的用法lshmid=shmget(key,size,IPC_CREAT
7、IPC_EXCL
8、mode);lshmid=shmget(IPC_PRIVATE,size,mode);void*shmat(intshmid,constvoid*shmaddr,intshmflg);典型用法:lshmaddr
9、=shmat(shmid,NULL,0);intshmdt(constvoid*shmaddr);intshmctl(intshmid,intcmd,structshmid_ds*buf);典型用法:l取狀態(tài)shmctl(shmid,IPC_STAT,&buf);l刪除shmctl(shmid,IPC_RMID,NULL);實(shí)例structshmid_dsbuf;shmid=shmget(key,size,flag);if(shmid==-1){//errorhandling...}shmctl(shmid,IPC_STAT,&buf);//分析利用b
10、uf中的信息shmaddr=(char*)shmat(id,NULL,0);if(shmadd