實驗四、進程通信(二) ——消息通信_第1頁
實驗四、進程通信(二) ——消息通信_第2頁
實驗四、進程通信(二) ——消息通信_第3頁
實驗四、進程通信(二) ——消息通信_第4頁
實驗四、進程通信(二) ——消息通信_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、操作系統(tǒng)實驗報告實驗四、進程通信(二) 消息通信一、 實驗?zāi)康?) 加深對管道通信的了解2) 掌握利用管道進行通信的程序設(shè)計3) 了解共享內(nèi)存通信的程序設(shè)計方法4) 了解和熟悉Linux支持的共享存儲區(qū)機制二、 實驗內(nèi)容任務(wù):(1)每個同學(xué)登陸兩個窗口,先在一個窗口中運行程序1(或者只登陸一個窗口,先在該窗口中以后臺方式運行程序1),用ipcs命令查看系統(tǒng)中消息隊列的情況,然后在另一個窗口中運行程序2,觀察程序的運行結(jié)果并分析。運行結(jié)束后可以用ctrl+c結(jié)束程序1的運行,再次用ipcs命令觀察系統(tǒng)中消息隊列的情況。(2)使用系統(tǒng)調(diào)用msgget(),msgsnd(),msgrev()及msg

2、ctl()編制一長度為1K的消息的發(fā)送和接收程序。為了便于操作和觀察結(jié)果,用一個程序作為“引子”,先后fork()兩個子進程,SERVER和CLIENT,進行通信。SERVER端建立一個Key為學(xué)號末3位的消息隊列,等待其他進程發(fā)來的消息。當(dāng)遇到類型為1的消息,則作為結(jié)束信號,取消該隊列,并退出SERVER。SERVER每接收到一個消息后顯示一句“(server)received”。CLIENT端使用key為學(xué)號末3位的消息隊列,先后發(fā)送類型從10到1的消息,然后退出。最后的一個消息,即是SERVER端需要的結(jié)束信號。CLIENT每發(fā)送一條消息后顯示一句“(client)sent”。父進程在S

3、ERVER和CLIENT均退出后結(jié)束。三、 代碼及運行結(jié)果分析(1)每個同學(xué)登陸兩個窗口,先在一個窗口中運行程序1(或者只登陸一個窗口,先在該窗口中以后臺方式運行程序1),用ipcs命令查看系統(tǒng)中消息隊列的情況,然后在另一個窗口中運行程序2,觀察程序的運行結(jié)果并分析。運行結(jié)束后可以用ctrl+c結(jié)束程序1的運行,再次用ipcs命令觀察系統(tǒng)中消息隊列的情況先在一個窗口中運行程序1程序1實驗代碼:#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#define MSGKEY 208 /*在

4、實際實驗過程中,為了避免每個同學(xué)建立的消息隊列關(guān)鍵字一樣而相互干擾,關(guān)鍵字請用學(xué)號末3位*/struct msgform long mtype; char mtext 256; msg;int msgqid;main () int i ,pid, *pint; extern cleanup(); for (i=0;i<20;i+)/*軟中斷處理*/ signal (i,cleanup); msgqid = msgget (MSGKEY,0777|IPC_CREAT);/*建立與顧客進程相同的消息隊列*/for (;) msgrcv (msgqid ,&msg,256,1,0);/

5、*接收來自顧客進程的消息*/ pint=(int * ) msg. mtext; pid = * pint; printf ("server:receive from pid %dn",pid); msg.mtype=pid; *pint=getpid(); msgsnd (msgqid,&msg ,sizeof (int) ,0) ;/*發(fā)送應(yīng)答消息*/ cleanup() msgctl (msgqid ,IPC_RMID,0); exit(); 運行結(jié)果:ipcs命令查看在另一個窗口中運行程序2程序2實驗代碼:#include <sys/types.h&g

6、t;#include <sys/ipc.h>#include <sys/msg.h>#define MSGKEY 208 /*在實際實驗過程中,為了避免每個同學(xué)建立的消息隊列關(guān)鍵字一樣而相互干擾,關(guān)鍵字請用學(xué)號末3位*/struct msgform long mtype; char mtext 256;main()struct msgform msg;int msgqid,pid, *pint;msgqid=msgget(MSGKEY,0777);/*建立消息隊列*/pid=getpid();pint=(int *)msg.mtext;*pint=pid;msg.mty

7、pe=1;/*指定消息類型*/msgsnd(msgqid,&msg,sizeof(int),0);/*往msgqid發(fā)送消息msg*/msgrcv(msgqid,&msg,256,pid,0);/*接收來自服務(wù)進程的消息*/printf("client : receive from pid%dn",*pint);運行結(jié)果:再次用ipcs命令觀察系統(tǒng)中消息隊列的情況分析:調(diào)用pipe(fd);創(chuàng)建一個管道后,接著調(diào)用fork()函數(shù)產(chǎn)生兩個進程,首先開始執(zhí)行子進程,關(guān)閉管道出口,通過管道入口向管道中寫入內(nèi)容。執(zhí)行if語句后,進入else語句塊內(nèi)開始父進程,管道

8、入口關(guān)閉,通過管道出口端從管道中讀取之前寫入內(nèi)容,最后輸出出來(2)使用系統(tǒng)調(diào)用msgget(),msgsnd(),msgrev()及msgctl()編制一長度為1K的消息的發(fā)送和接收程序。為了便于操作和觀察結(jié)果,用一個程序作為“引子”,先后fork()兩個子進程,SERVER和CLIENT,進行通信。SERVER端建立一個Key為學(xué)號末3位的消息隊列,等待其他進程發(fā)來的消息。當(dāng)遇到類型為1的消息,則作為結(jié)束信號,取消該隊列,并退出SERVER。SERVER每接收到一個消息后顯示一句“(server)received”。CLIENT端使用key為學(xué)號末3位的消息隊列,先后發(fā)送類型從10到1的消

9、息,然后退出。最后的一個消息,即是SERVER端需要的結(jié)束信號。CLIENT每發(fā)送一條消息后顯示一句“(client)sent”。父進程在SERVER和CLIENT均退出后結(jié)束。實驗代碼:#include<stdio.h>#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h> #define MSGKEY 201struct msgform long mtype; char mtext1030; msg; int msgqid,i;v

10、oid CLIENT()int i; msgqid=msgget(MSGKEY,0777);for(i=10;i>=1;i-) msg.mtype=i; printf("(client)sentn"); msgsnd(msgqid,&msg,1024,0); exit(0); void SERVER() msgqid=msgget(MSGKEY,0777|IPC_CREAT);do msgrcv(msgqid,&msg,1030,0,0);printf("(ser

11、ver)receivedn");while(msg.mtype!=1); msgctl(msgqid,IPC_RMID,0);exit(0); int main() while(i=fork()=-1);if(!i)SERVER(); while(i=fork()=-1);if(!i)CLIENT();wait(0);wait(0); 運行結(jié)果:分析:msgflg低9位類似于文件訪問權(quán)限的低9位,其他位指明消息隊列的建立方式:若指定的關(guān)鍵字消息隊列不存在,msgflg&IPC_CREAT為真,則為他建立一個新的消息隊列; msgflg&IPC_CREAT為假,返回-1。若指定的關(guān)鍵字消息隊列存在,則返回該消息隊列的描述符。若msgflg&IPC_CREAT&IPC_EXCL為真,若指定的關(guān)鍵字消息隊列不存在,失敗返回-1;否則正常返回。若key等于IPC_PRIVATE,則msgget調(diào)用總是成功的。 根據(jù)控制命令cmd對msqid消息隊列進行相應(yīng)的控制。參數(shù)buf是指向用戶程序地址空間中一個msqid_ds結(jié)構(gòu)的指針,以便將相

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論