版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 實(shí)驗(yàn)三 進(jìn)程通訊實(shí)驗(yàn)報(bào)告【姓名】【學(xué)號(hào)】【實(shí)驗(yàn)題目】進(jìn)程通訊消息隊(duì)列與共享存儲(chǔ)區(qū)【實(shí)驗(yàn)?zāi)康摹浚?) 掌握進(jìn)程間通訊的編程方法;(2) 加深對(duì)進(jìn)程并發(fā)執(zhí)行的理解;(3) 學(xué)習(xí)利用消息隊(duì)列和共享存儲(chǔ)區(qū)實(shí)現(xiàn)進(jìn)程通信的方法。【實(shí)驗(yàn)內(nèi)容】 設(shè)計(jì)一個(gè)多進(jìn)程并發(fā)運(yùn)行的程序,它由不同的進(jìn)程完成下列工作:(1)接收鍵盤輸入進(jìn)程 負(fù)責(zé)接收用戶的鍵盤輸入,并以適當(dāng)?shù)姆绞綄⒂涉I盤獲得的數(shù)據(jù)交給其它進(jìn)程處理。(2)顯示進(jìn)程 負(fù)責(zé)全部數(shù)據(jù)顯示任務(wù),包括鍵盤輸入數(shù)據(jù)的顯示和提示信息的顯示。(3)分發(fā)數(shù)據(jù)進(jìn)程 將鍵盤輸入的數(shù)據(jù)分為3類,即字母、數(shù)字和其它,并分別將字母寫入文件letter.txt中,數(shù)字寫入文件number
2、.txt中,除字母和數(shù)字外其它數(shù)據(jù)丟棄?!緦?shí)驗(yàn)要求】1、 程序能以適當(dāng)?shù)姆绞教崾居脩糨斎霐?shù)據(jù);2、 提示用戶有數(shù)據(jù)被丟棄;3、 全部的顯示任務(wù)必須由顯示進(jìn)程完成;4、 整個(gè)程序能夠連續(xù)處理多組輸入數(shù)據(jù),直到用戶輸入“quit”字符串,整個(gè)程序結(jié)束;5、 進(jìn)一步要求:同時(shí)采用共享存儲(chǔ)區(qū)和消息2種方法實(shí)現(xiàn)進(jìn)程之間的通信,并比較這2種通信方法的利弊。【實(shí)驗(yàn)方法】1、 利用fork()函數(shù)創(chuàng)建2個(gè)子進(jìn)程,用一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程完成上面的三個(gè)實(shí)驗(yàn)任務(wù),用子進(jìn)程1實(shí)現(xiàn)分發(fā)數(shù)據(jù)任務(wù),子進(jìn)程2實(shí)現(xiàn)接受鍵盤輸入任務(wù),父進(jìn)程實(shí)現(xiàn)全部的顯示任務(wù)。2、 同時(shí)通過(guò)共享存儲(chǔ)區(qū)和消息隊(duì)列兩種進(jìn)程通訊方式實(shí)現(xiàn)上面三個(gè)進(jìn)程之
3、間的同步和互斥。3、 利用while()循環(huán)、kill()函數(shù)和signal()函數(shù)實(shí)現(xiàn)連續(xù)多組數(shù)據(jù)輸入。【程序結(jié)構(gòu)】 數(shù)據(jù)結(jié)構(gòu):消息隊(duì)列、字符數(shù)組; 程序結(jié)構(gòu):順序結(jié)構(gòu)、if-else分支結(jié)構(gòu)和while循環(huán)結(jié)構(gòu); 主要算法:無(wú)特別算法【實(shí)驗(yàn)結(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)建子進(jìn)程1時(shí),由于先返回子進(jìn)程的ID號(hào),msgrcv(msgid,&msg,BUFSIZE,0,0)一直都是非0值,故循環(huán)等待。接著返回父進(jìn)程ID,父進(jìn)程負(fù)責(zé)全部的顯示任務(wù),先提示用戶輸入“Please input a line:”,然后等待子進(jìn)程2的16信號(hào)所以當(dāng)子進(jìn)程2負(fù)責(zé)從鍵盤接收字符,當(dāng)輸入“operatingsystem01234-=,.”后,由子進(jìn)程2發(fā)送消息(內(nèi)容為:operatingsystem01234-=,.)給子進(jìn)程1,由子進(jìn)程1實(shí)現(xiàn)
6、分發(fā)任務(wù),將字符輸出到文件“l(fā)etter.txt”,將數(shù)字輸出到文件“number.txt”,將其他字符寫到“拋棄字符共享存儲(chǔ)區(qū)array”并將從消息隊(duì)列中讀取的字符串寫到字符共享存儲(chǔ)區(qū)addr中,再向父進(jìn)程發(fā)送16信號(hào),實(shí)現(xiàn)進(jìn)程之間的同步;之后由父進(jìn)程接收16信號(hào)后,從addr共享存儲(chǔ)區(qū)中獲取由鍵盤輸入的字符串,并由終端輸出顯示,若有字符丟棄,同時(shí)也提醒用戶有哪些字符被丟棄了,顯示到終端。通過(guò)while()循環(huán),實(shí)現(xiàn)多組數(shù)據(jù)輸入并顯示和分發(fā)寫入文件。當(dāng)用戶需要退出時(shí),從終端輸入”quit”,所有子進(jìn)程退出,由父進(jìn)程斷開和共享存儲(chǔ)區(qū)的附接并刪除消息隊(duì)列,之后也退出。【問(wèn)題分析】實(shí)驗(yàn)中出現(xiàn)的問(wèn)題
7、及解決辦法:1、比較消息隊(duì)列和共享存儲(chǔ)區(qū)在消息通信機(jī)制中的數(shù)據(jù)傳輸?shù)臅r(shí)間和性能:由于兩種機(jī)制實(shí)現(xiàn)的機(jī)理和用處都不一樣,難以直接進(jìn)行時(shí)間上的比較。如果比較其性能,應(yīng)更加全面地分析。消息隊(duì)列的建立比共享區(qū)的建立消耗的資源少。前者只是一個(gè)軟件上設(shè)定的問(wèn)題,后者需要對(duì)硬件操作,實(shí)現(xiàn)內(nèi)存的映像,當(dāng)然控制起來(lái)比前者復(fù)雜,如果每次都更新進(jìn)行隊(duì)列或共享的建立,共享區(qū)的設(shè)立沒有什么優(yōu)勢(shì)。當(dāng)消息隊(duì)列和共享區(qū)建立好后,共享區(qū)的數(shù)據(jù)傳輸受到系統(tǒng)硬件的支持,不耗費(fèi)多余的資源;而消息傳遞由軟件進(jìn)行控制和實(shí)現(xiàn),需要消耗定的CPU資源。從這個(gè)意義上講,共享區(qū)更適合頻繁和大量的數(shù)據(jù)傳輸。消息的傳遞,自身就帶有同步的控制。當(dāng)?shù)鹊?/p>
8、消息的時(shí)候,進(jìn)程進(jìn)入睡眠狀態(tài),不再消耗CPU資源。而共享隊(duì)列如果不借助其他機(jī)制進(jìn)行同步,接收數(shù)據(jù)的一方必須進(jìn)行不斷的查詢,進(jìn)入忙等待狀態(tài),白白浪費(fèi)了大量的CPU資源??梢姡⒎绞降氖褂酶屿`活。2、有關(guān)字符數(shù)組初始化函數(shù)的使用:在本實(shí)驗(yàn)中頻繁使用了memset()函數(shù),且第二個(gè)參數(shù)均為0,是為了將每次從鍵盤輸入的字符串都能存到一個(gè)空的字符數(shù)組中,以防止字符的重復(fù)和覆蓋。3、在本程序中,需要合理安排父進(jìn)程和2個(gè)子進(jìn)程的任務(wù),由父進(jìn)程來(lái)負(fù)責(zé)顯示任務(wù)是最合理和最簡(jiǎn)單的情況,因?yàn)楦高M(jìn)程與子進(jìn)程在某些方面是共享的,無(wú)需另外啟用消息通信機(jī)制。而且在實(shí)現(xiàn)多組數(shù)據(jù)的輸入、顯示和分發(fā)方面能實(shí)現(xiàn)很好的同步和互斥
9、。4、注意消息緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu),主要用來(lái)存放需要發(fā)送或者接收的消息類型和消息正文,在/usr/src/linux-2.4/include/linux/msg.h中描述如下:/*message buffer for msgsnd and msgrcv calls*/struct msgbuf long mtype; /消息類型,由用戶決定 char mtextMAXMSG;/消息正文;5、在程序修改之前存在一個(gè)bug,就是在輸入的字符串中不能存在空格或制表符,如果出現(xiàn)空格或者制表符,將只會(huì)顯示空格或者制表符后面的內(nèi)容,前面的不顯示。這是由于scanf()函數(shù)的作用,當(dāng)他遇到空格或制表符時(shí),就會(huì)只
10、讀入后面的內(nèi)容。有人想到會(huì)用gets()來(lái)接受一行,但是懂C的人基本上都知道gets()是一個(gè)很危險(xiǎn)的函數(shù),而且很難控制,特別是與scanf()交替使用時(shí)前者的劣勢(shì)更是一覽無(wú)余,所以gets()一般是不推薦用的。那么我們可以用%n%*c控制語(yǔ)句來(lái)隔離掉其中的空格或者制表符對(duì)讀入一行字符串的影響。【程序清單】下面為可執(zhí)行的C程序清單以及相應(yīng)的注釋:/*進(jìn)程通信之消息隊(duì)列與共享存儲(chǔ)區(qū)*/#include#include#include#include#include#include#include#include#include#include#include#include#define MAX
11、MSG 128 /消息隊(duì)列的最大長(zhǎng)度#define BUFSIZE 128 /緩沖區(qū)的最大長(zhǎng)度/*定義消息的數(shù)據(jù)結(jié)構(gòu)*/struct my_msg long int mtype; /消息類型 char mtextMAXMSG; /消息內(nèi)容msg;int pid,pid1,pid2;/定義父進(jìn)程和兩個(gè)子進(jìn)程的id標(biāo)識(shí)int i,j;char bufferBUFSIZE,msgtextMAXMSG; /定義緩沖區(qū)和接受暫存字符數(shù)組void stop()main() /*定義共享內(nèi)存*/ int shmid1,shmid2;/定義2個(gè)共享存儲(chǔ)區(qū)的內(nèi)部標(biāo)識(shí) 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)建消息隊(duì)列并初始化*/ int msgid; msgid=msgget(IPC_PRIVATE,IPC_CREAT|0666); pid=getpid();/獲取父進(jìn)程ID號(hào) 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;/向子進(jìn)程1發(fā)送消息 if(strcmp(buffer,quit)=0)break; exit(0); else printf(Please input a line:n);
14、/提示輸入 while(1) signal(16,stop);/接收子進(jìn)程發(fā)送的信號(hào) pause();/父進(jìn)程掛起 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); /*刪除消息隊(duì)列*/ 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年山東濟(jì)寧市鄒城市事業(yè)單位(綜合類)人才引進(jìn)50人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東濟(jì)寧醫(yī)學(xué)院招聘54人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東濟(jì)南市環(huán)保局環(huán)境監(jiān)測(cè)中心站招考6人管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東泰安新泰市衛(wèi)健系統(tǒng)事業(yè)單位招聘264人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東氣象局應(yīng)屆高校畢業(yè)生招考管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東棗莊市臺(tái)兒莊區(qū)事業(yè)單位急需緊缺人才招聘70人(補(bǔ)發(fā))管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東德州齊河縣教育衛(wèi)生事業(yè)單位招考和招考管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東德州夏津縣事業(yè)單位初級(jí)綜合類崗位招聘工作人員121人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東醫(yī)學(xué)科學(xué)院及事業(yè)單位校園招考管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東東營(yíng)市河口區(qū)招聘勞務(wù)派遣人員10人管理單位筆試遴選500模擬題附帶答案詳解
- 2024年度共享辦公空間租賃合同2篇
- 理論力學(xué)(浙江大學(xué))知到智慧樹章節(jié)答案
- JJF 1629-2017 烙鐵溫度計(jì)校準(zhǔn)規(guī)范(高清版)
- 理想系列一體化速印機(jī)故障代碼
- 檢驗(yàn)科各專業(yè)組上崗輪崗培訓(xùn)考核制度全6頁(yè)
- 部編版二年級(jí)下冊(cè)語(yǔ)文拼音練習(xí)
- 建筑施工危大工程監(jiān)理實(shí)施細(xì)則
- 六年級(jí)上冊(cè)數(shù)學(xué)單元測(cè)試第七單元檢測(cè)卷∣蘇教版
- 2021年全國(guó)煙草工作會(huì)議上的報(bào)告
- [資料]馬蘭士(MarantzPM17)功放維護(hù)修理手冊(cè)(含電路圖)
- 電氣工程課程設(shè)計(jì)——車間動(dòng)力及照明設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論