




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 實驗三 進程通訊實驗報告【姓名】【學(xué)號】【實驗題目】進程通訊消息隊列與共享存儲區(qū)【實驗?zāi)康摹浚?) 掌握進程間通訊的編程方法;(2) 加深對進程并發(fā)執(zhí)行的理解;(3) 學(xué)習(xí)利用消息隊列和共享存儲區(qū)實現(xiàn)進程通信的方法。【實驗內(nèi)容】 設(shè)計一個多進程并發(fā)運行的程序,它由不同的進程完成下列工作:(1)接收鍵盤輸入進程 負責接收用戶的鍵盤輸入,并以適當?shù)姆绞綄⒂涉I盤獲得的數(shù)據(jù)交給其它進程處理。(2)顯示進程 負責全部數(shù)據(jù)顯示任務(wù),包括鍵盤輸入數(shù)據(jù)的顯示和提示信息的顯示。(3)分發(fā)數(shù)據(jù)進程 將鍵盤輸入的數(shù)據(jù)分為3類,即字母、數(shù)字和其它,并分別將字母寫入文件letter.txt中,數(shù)字寫入文件number
2、.txt中,除字母和數(shù)字外其它數(shù)據(jù)丟棄。【實驗要求】1、 程序能以適當?shù)姆绞教崾居脩糨斎霐?shù)據(jù);2、 提示用戶有數(shù)據(jù)被丟棄;3、 全部的顯示任務(wù)必須由顯示進程完成;4、 整個程序能夠連續(xù)處理多組輸入數(shù)據(jù),直到用戶輸入“quit”字符串,整個程序結(jié)束;5、 進一步要求:同時采用共享存儲區(qū)和消息2種方法實現(xiàn)進程之間的通信,并比較這2種通信方法的利弊。【實驗方法】1、 利用fork()函數(shù)創(chuàng)建2個子進程,用一個父進程和兩個子進程完成上面的三個實驗任務(wù),用子進程1實現(xiàn)分發(fā)數(shù)據(jù)任務(wù),子進程2實現(xiàn)接受鍵盤輸入任務(wù),父進程實現(xiàn)全部的顯示任務(wù)。2、 同時通過共享存儲區(qū)和消息隊列兩種進程通訊方式實現(xiàn)上面三個進程之
3、間的同步和互斥。3、 利用while()循環(huán)、kill()函數(shù)和signal()函數(shù)實現(xiàn)連續(xù)多組數(shù)據(jù)輸入。【程序結(jié)構(gòu)】 數(shù)據(jù)結(jié)構(gòu):消息隊列、字符數(shù)組; 程序結(jié)構(gòu):順序結(jié)構(gòu)、if-else分支結(jié)構(gòu)和while循環(huán)結(jié)構(gòu); 主要算法:無特別算法【實驗結(jié)果】 1、有代表性的執(zhí)行結(jié)果:stud13localhost stud13$ cc ipc.cstud13localhost stud13$ ./a.outPlease input a line:operatingsystem01234-=,.Your message is:operatingsystem01234-=,.The characters
4、deserted are:-=,.Please input a line:xushengju6651001!#$%&*()Your message is:xushengju6651001!#$%&*()The characters deserted are:!#$%&*()Please input a line:Hello123Your message is:Hello123Please input a line:quitstud13localhost stud13$ cat letter.txtOperatingsystemxushengjuHellostud13localhost stud
5、13$ cat number.txt012346651001123stud13localhost stud13$ 2、結(jié)果分析及解釋: 在創(chuàng)建子進程1時,由于先返回子進程的ID號,msgrcv(msgid,&msg,BUFSIZE,0,0)一直都是非0值,故循環(huán)等待。接著返回父進程ID,父進程負責全部的顯示任務(wù),先提示用戶輸入“Please input a line:”,然后等待子進程2的16信號所以當子進程2負責從鍵盤接收字符,當輸入“operatingsystem01234-=,.”后,由子進程2發(fā)送消息(內(nèi)容為:operatingsystem01234-=,.)給子進程1,由子進程1實現(xiàn)
6、分發(fā)任務(wù),將字符輸出到文件“l(fā)etter.txt”,將數(shù)字輸出到文件“number.txt”,將其他字符寫到“拋棄字符共享存儲區(qū)array”并將從消息隊列中讀取的字符串寫到字符共享存儲區(qū)addr中,再向父進程發(fā)送16信號,實現(xiàn)進程之間的同步;之后由父進程接收16信號后,從addr共享存儲區(qū)中獲取由鍵盤輸入的字符串,并由終端輸出顯示,若有字符丟棄,同時也提醒用戶有哪些字符被丟棄了,顯示到終端。通過while()循環(huán),實現(xiàn)多組數(shù)據(jù)輸入并顯示和分發(fā)寫入文件。當用戶需要退出時,從終端輸入”quit”,所有子進程退出,由父進程斷開和共享存儲區(qū)的附接并刪除消息隊列,之后也退出。【問題分析】實驗中出現(xiàn)的問題
7、及解決辦法:1、比較消息隊列和共享存儲區(qū)在消息通信機制中的數(shù)據(jù)傳輸?shù)臅r間和性能:由于兩種機制實現(xiàn)的機理和用處都不一樣,難以直接進行時間上的比較。如果比較其性能,應(yīng)更加全面地分析。消息隊列的建立比共享區(qū)的建立消耗的資源少。前者只是一個軟件上設(shè)定的問題,后者需要對硬件操作,實現(xiàn)內(nèi)存的映像,當然控制起來比前者復(fù)雜,如果每次都更新進行隊列或共享的建立,共享區(qū)的設(shè)立沒有什么優(yōu)勢。當消息隊列和共享區(qū)建立好后,共享區(qū)的數(shù)據(jù)傳輸受到系統(tǒng)硬件的支持,不耗費多余的資源;而消息傳遞由軟件進行控制和實現(xiàn),需要消耗定的CPU資源。從這個意義上講,共享區(qū)更適合頻繁和大量的數(shù)據(jù)傳輸。消息的傳遞,自身就帶有同步的控制。當?shù)鹊?/p>
8、消息的時候,進程進入睡眠狀態(tài),不再消耗CPU資源。而共享隊列如果不借助其他機制進行同步,接收數(shù)據(jù)的一方必須進行不斷的查詢,進入忙等待狀態(tài),白白浪費了大量的CPU資源。可見,消息方式的使用更加靈活。2、有關(guān)字符數(shù)組初始化函數(shù)的使用:在本實驗中頻繁使用了memset()函數(shù),且第二個參數(shù)均為0,是為了將每次從鍵盤輸入的字符串都能存到一個空的字符數(shù)組中,以防止字符的重復(fù)和覆蓋。3、在本程序中,需要合理安排父進程和2個子進程的任務(wù),由父進程來負責顯示任務(wù)是最合理和最簡單的情況,因為父進程與子進程在某些方面是共享的,無需另外啟用消息通信機制。而且在實現(xiàn)多組數(shù)據(jù)的輸入、顯示和分發(fā)方面能實現(xiàn)很好的同步和互斥
9、。4、注意消息緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu),主要用來存放需要發(fā)送或者接收的消息類型和消息正文,在/usr/src/linux-2.4/include/linux/msg.h中描述如下:/*message buffer for msgsnd and msgrcv calls*/struct msgbuf long mtype; /消息類型,由用戶決定 char mtextMAXMSG;/消息正文;5、在程序修改之前存在一個bug,就是在輸入的字符串中不能存在空格或制表符,如果出現(xiàn)空格或者制表符,將只會顯示空格或者制表符后面的內(nèi)容,前面的不顯示。這是由于scanf()函數(shù)的作用,當他遇到空格或制表符時,就會只
10、讀入后面的內(nèi)容。有人想到會用gets()來接受一行,但是懂C的人基本上都知道gets()是一個很危險的函數(shù),而且很難控制,特別是與scanf()交替使用時前者的劣勢更是一覽無余,所以gets()一般是不推薦用的。那么我們可以用%n%*c控制語句來隔離掉其中的空格或者制表符對讀入一行字符串的影響。【程序清單】下面為可執(zhí)行的C程序清單以及相應(yīng)的注釋:/*進程通信之消息隊列與共享存儲區(qū)*/#include#include#include#include#include#include#include#include#include#include#include#include#define MAX
11、MSG 128 /消息隊列的最大長度#define BUFSIZE 128 /緩沖區(qū)的最大長度/*定義消息的數(shù)據(jù)結(jié)構(gòu)*/struct my_msg long int mtype; /消息類型 char mtextMAXMSG; /消息內(nèi)容msg;int pid,pid1,pid2;/定義父進程和兩個子進程的id標識int i,j;char bufferBUFSIZE,msgtextMAXMSG; /定義緩沖區(qū)和接受暫存字符數(shù)組void stop()main() /*定義共享內(nèi)存*/ int shmid1,shmid2;/定義2個共享存儲區(qū)的內(nèi)部標識 char *addr,*array; /*創(chuàng)
12、建并附接共享內(nèi)存*/ shmid1=shmget(IPC_PRIVATE,BUFSIZE,IPC_CREAT|0666); shmid2=shmget(IPC_PRIVATE,BUFSIZE,IPC_CREAT|0666); addr=(char *)shmat(shmid1,NULL,0); array=(char *)shmat(shmid2,NULL,0); /*創(chuàng)建消息隊列并初始化*/ int msgid; msgid=msgget(IPC_PRIVATE,IPC_CREAT|0666); pid=getpid();/獲取父進程ID號 while(pid1=fork()=-1); if
13、(pid10) while(pid2=fork()=-1); if(pid2=0) while(1) memset(buffer,0,0); scanf(%n%*c,buffer);/從終端輸入字符串 memset(msg.mtext,0,0); strcpy(msg.mtext,buffer); msg.mtype=1;/設(shè)置消息類型為1 if(msgsnd(msgid,&msg,MAXMSG,0)0)return 0;/向子進程1發(fā)送消息 if(strcmp(buffer,quit)=0)break; exit(0); else printf(Please input a line:n);
14、/提示輸入 while(1) signal(16,stop);/接收子進程發(fā)送的信號 pause();/父進程掛起 if(strcmp(addr,quit)=0)break;/判斷是否退出并終止循環(huán) printf(Your message is:n%sn,addr);/輸出從終端輸入的內(nèi)容 if(strlen(array)!=0)/輸出被拋棄的字符 printf(The characters deserted are:n%sn,array); memset(addr,0,0); printf(Please input a line:n); wait(0); wait(0); /*斷開附接*/
15、shmdt(addr); shmdt(array); /*撤銷共享內(nèi)存*/ shmctl(shmid1,IPC_RMID,0); shmctl(shmid2,IPC_RMID,0); /*刪除消息隊列*/ msgctl(msgid,IPC_RMID,0); exit(0); else FILE *fp1,*fp2; fp1=fopen(letter.txt,w);/打開文件 fp2=fopen(number.txt,w); while(1) if(!msgrcv(msgid,&msg,BUFSIZE,0,0)return 0;/接收消息 i=0; j=0; memset(msgtext,0,sizeof(msgtext); memset(array,0,sizeof(array); strcpy(msgtext,msg.mtext); strcpy(addr,msg.mtext); if(strcmp(msgtext,quit)=0)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市場調(diào)查問卷反饋統(tǒng)計表格
- 化學(xué)材料結(jié)構(gòu)知識專題練習(xí)
- 臨夏現(xiàn)代職業(yè)學(xué)院《社會查與統(tǒng)計》2023-2024學(xué)年第二學(xué)期期末試卷
- 上海商學(xué)院《在歷史坐標上解析日本》2023-2024學(xué)年第二學(xué)期期末試卷
- 體育館燈光控制系統(tǒng)行業(yè)深度調(diào)研及發(fā)展項目商業(yè)計劃書
- 廈門大學(xué)《水科學(xué)概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 鐵路主題旅館(如舊火車車廂改造)行業(yè)深度調(diào)研及發(fā)展項目商業(yè)計劃書
- 煙臺科技學(xué)院《現(xiàn)代食品加工技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 車船住宿線上推廣行業(yè)跨境出海項目商業(yè)計劃書
- 博物館藝術(shù)展覽企業(yè)制定與實施新質(zhì)生產(chǎn)力項目商業(yè)計劃書
- 遙測信號抗干擾-深度研究
- 2024春形勢與政策-鑄牢中華民族共同體意識課件
- 金融科技概論 章習(xí)題及答案 第1-8章
- 低壓電氣基礎(chǔ)知識培訓(xùn)電工-電氣工程師
- 2021-2022學(xué)年北京市朝陽區(qū)人教版三年級下冊期末考試數(shù)學(xué)試卷及答案
- 2025年江蘇鹽城市海興集團有限公司招聘筆試參考題庫含答案解析
- 乙酸鈉合同范例
- DB35-T 2208-2024 面向視頻圖像識別的AI邊緣計算系統(tǒng)應(yīng)用技術(shù)要求
- Unit 5 The Value of Money Reading for Writing 說課稿-2023-2024學(xué)年高中英語人教版(2019)必修第三冊
- 《污染地塊風險管控與修復(fù)工程職業(yè)健康防控指南》
- 2025神華新街能源限責任公司系統(tǒng)內(nèi)招聘23人(第二批)高頻重點提升(共500題)附帶答案詳解
評論
0/150
提交評論