西北工業(yè)大學(xué)-操作系統(tǒng)實驗報告-實驗七_第1頁
西北工業(yè)大學(xué)-操作系統(tǒng)實驗報告-實驗七_第2頁
西北工業(yè)大學(xué)-操作系統(tǒng)實驗報告-實驗七_第3頁
西北工業(yè)大學(xué)-操作系統(tǒng)實驗報告-實驗七_第4頁
西北工業(yè)大學(xué)-操作系統(tǒng)實驗報告-實驗七_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、實驗七 消息及其傳送機制一、 實驗?zāi)康模?)了解什么是消息。(2)熟悉消息傳送的機理。二、 實驗內(nèi)容與要求1、消息的創(chuàng)建、發(fā)送和接收。使用系統(tǒng)調(diào)用msgget( ),msgsnd( ),msgrev( ),及msgctl( )編制一長度為256Bytes的消息發(fā)送和接收的程序,將自己的進程號傳遞給對方,并輸出至屏幕。2、對整個實驗過程進行分析總結(jié),給出詳細步驟。三、 實驗過程1、編寫程序?qū)崿F(xiàn)消息的創(chuàng)建、發(fā)送和接收。將參考程序用vi編輯器錄入,然后編譯執(zhí)行。1、 client.c#include #include #include #include #include #define MSGKEY

2、 75 /*定義一個消息關(guān)鍵字*/struct msgform /*定義一個結(jié)構(gòu),它是一個消息的模式,只說明結(jié)構(gòu)的形式*/ long mtype; /*消息類型*/ char mtext256; /*消息正文數(shù)組*/; int main()struct msgform msg; /*定義msg是前面說明的消息結(jié)構(gòu)類型的變量*/int msggid,pid,*pint;msggid=msgget(MSGKEY,0777); /*用系統(tǒng)調(diào)用創(chuàng)建一個消息隊列*/pid=getpid(); /*獲得當(dāng)前進程的PID*/printf(“client:pid=%dn”, pid);pint=(int*)m

3、sg.mtext; /*將消息正文的頭指針賦給指針變量pint*/ *pint=pid;msg.mtype=1; /*指定客戶進程的消息類型為1*/msgsnd(msggid,&msg,sizeof(int),0); /*向msggid的消息隊列發(fā)送消息msg*/msgrcv(msggid,&msg,256,pid,0); /*接收pid類型的消息 */printf(“client:receive from pid %dn”,*pint);return 0;2、server.c#include #include #include #include #include #include #incl

4、ude #define MSGKEY 75 /*定義一個消息關(guān)鍵字*/struct msgform /*定義一個與客戶端相同的消息關(guān)鍵字*/ long mtype; /*消息類型*/ char mtext256; /*消息正文數(shù)組*/msg; /*也可以使用這種方式說明消息結(jié)構(gòu)變量*/ void cleanup(int signo); /*說明一個外部函數(shù)*/ int msgqid;int main()int i,pid,*pint;for ( i=0; i23; i+) /*對22個軟中斷的特殊處理*/signal(i, cleanup); /*若收到22個軟中斷,轉(zhuǎn)向執(zhí)行cleanup*/

5、msggid=msgget(MSGKEY,0777|IPC_CREAT); /*創(chuàng)建一個與客戶程序相同關(guān)鍵字的消息隊列,但它的標(biāo)志是0777與IPC_CREAT 做“或”操作的結(jié)果*/printf(“server:pid=%dn”, getpid(); /*輸出服務(wù)端的進程ID*/for(;) /*用無限循環(huán)完成下列語句*/ msgrcv(msggid,&msg,256,1,0); /*接收來自客戶進程或類型為1的消息 */pint=(int*)msg.mtext; /*將客戶端的消息正文傳遞給pint*/ pid=*pint; /*將讀出消息指針?biāo)蚿id,此時*pint中是客戶進程的pid值

6、*/printf(“server:receive from pid %dn”,pid);msg.mtype=pid; /*已接受客戶進程的pid為消息類型*/*pint=getpid(); /*以本進程pid作為消息構(gòu)成消息傳遞內(nèi)容*/msgsnd(msggid,&msg,sizeof(int),0); /*發(fā)送消息*/void cleanup(int signo) msgctl(msggid , IPC_RMID , 0); /*刪除消息隊列*/exit(0);如下圖所示:client.cserver.c運行結(jié)果如下所示:2、思考題(1)單獨執(zhí)行client或server 有什么結(jié)果? (2

7、)執(zhí)行一個server程序,多次執(zhí)行client有什么結(jié)果? (3)消息機制與管道通信的區(qū)別?在消息機制中,進程間的數(shù)據(jù)交換是以格式化的message為單位,程序員直接利用操作系統(tǒng)提供的一組通信命令,不僅能實現(xiàn)大量的數(shù)據(jù)傳遞,而且還是隱藏通信細節(jié),是通信過程對用戶透明,減少通信程序的復(fù)雜性。當(dāng)今流行的微內(nèi)核操作系統(tǒng)中,微內(nèi)核與服務(wù)器間的通信都采用了消息機制。管道,是指連接一個讀進程和寫進程以實現(xiàn)他們之間通信的一個共享文件。向管道提供輸入的發(fā)送進程,以字符流形式將大量數(shù)據(jù)送入管道;而接受管道輸出的接收進程,從管道中接收數(shù)據(jù)。管道通信方式的中間介質(zhì)是文件,通常稱這種文件為管道文件。兩個進程利用管道

8、文件進行通信時,一個進程為寫進程,另一個進程為讀進程。寫進程通過寫端(發(fā)送端)往管道文件中寫入信息;讀進程通過讀端(接收端)從管道文件中讀取信息。兩個進程協(xié)調(diào)不斷地進行寫、讀,便會構(gòu)成雙方通過管道傳遞信息的流水線。消息通信方式以消息緩沖區(qū)為中間介質(zhì),通信雙方的發(fā)送和接收操作均以消息為單位。在存儲器中,消息緩沖區(qū)被組織成隊列,通常稱之為消息隊列。創(chuàng)建消息隊列用系統(tǒng)調(diào)用MSGGET()來實現(xiàn),這一步工作也被稱為消息隊列的初始化。在進行通信時,消息隊列的發(fā)送和接收分別用系統(tǒng)調(diào)用MSGSND()和MSGRCV()來實現(xiàn)。在需要改變隊列的使用權(quán)限及其它一些特性時,用MSGCTL()來實現(xiàn)。四、 實驗分析與總結(jié)通過這次實驗了解了Unix的消息機制,并獨自編程實現(xiàn)了消息的創(chuàng)建發(fā)送與接收,這對我對于

溫馨提示

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

評論

0/150

提交評論