版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
試驗(yàn)四進(jìn)程間通信(三)消息的發(fā)送與接受試驗(yàn)試驗(yàn)?zāi)康模豪斫馐裁词窍?。熟悉消息傳送機(jī)理。編程實(shí)現(xiàn)消息的發(fā)送與接受。預(yù)習(xí)內(nèi)容:試驗(yàn)內(nèi)容:消息的創(chuàng)立、發(fā)送和接受。使用系統(tǒng)調(diào)用msgget(),msgsnd(),msgrev(),及msgctl()編制一長度為1k的消息發(fā)送和接受的程序。<參照程序>1、client.c#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#defineMSGKEY75structmsgform{longmtype;charmtext[1000];}msg;intmsgqid;voidclient(){inti;msgqid=msgget(MSGKEY,0777);/*打開75#消息隊(duì)列*/for(i=10;i>=1;i--){msg.mtype=i;printf(“(client)sent\n”);msgsnd(msgqid,&msg,1024,0);/*發(fā)送消息*/}exit(0);}main(){client();}2、server.c#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#defineMSGKEY75structmsgform{longmtype;charmtext[1000];}msg;intmsgqid;voidserver(){msgqid=msgget(MSGKEY,0777|IPC_CREAT);/*創(chuàng)立75#消息隊(duì)列*/do{msgrcv(msgqid,&msg,1030,0,0);/*接受消息*/printf(“(server)received\n”);}while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);/*刪除消息隊(duì)列,償還資源*/exit(0);}main(){server();}程序闡明:1、為了便于操作和觀測成果,編制二個(gè)程序client.c和server.c,分別用于消息的發(fā)送與接受。2、server建立一種Key為75的消息隊(duì)列,等待其他進(jìn)程發(fā)來的消息。當(dāng)碰到類型為1的消息,則作為結(jié)束信號,取消該隊(duì)列,并退出server。server每接受到一種消息后顯示一句“(server)received?!?、client使用key為75的消息隊(duì)列,先后發(fā)送類型從10到1的消息,然后退出。最終一種消息,即是server端需要的結(jié)束信號。client每發(fā)送一條消息后顯示一句“(client)sent”。4、注意:二個(gè)程序分別編輯、編譯為client與server。執(zhí)行:./server&ipcs-q./client。試驗(yàn)闡明:一、什么是消息消息(message)是一種格式化的可變長的信息單元。消息機(jī)制容許由一種進(jìn)程給其他任意的進(jìn)程發(fā)送一種消息。當(dāng)一種進(jìn)程收到多種消息時(shí),可將它們排成一種消息隊(duì)列。消息使用二種重要的數(shù)據(jù)構(gòu)造:一是消息首部,其中記錄了某些與消息有關(guān)的信息,如消息數(shù)據(jù)的字節(jié)數(shù);二是消息隊(duì)列頭表,其每一表項(xiàng)是作為一種消息隊(duì)列的消息頭,記錄了消息隊(duì)列的有關(guān)信息。1、消息機(jī)制的數(shù)據(jù)構(gòu)造(1)消息首部記錄某些與消息有關(guān)的信息,如消息的類型、大小、指向消息數(shù)據(jù)區(qū)的指針、消息隊(duì)列的鏈接指針等。(2)消息隊(duì)列頭表其每一項(xiàng)作為一種消息隊(duì)列的消息頭,記錄了消息隊(duì)列的有關(guān)信息如指向消息隊(duì)列中第一種消息和指向最終一種消息的指針、隊(duì)列中消息的數(shù)目、隊(duì)列中消息數(shù)據(jù)的總字節(jié)數(shù)、隊(duì)列所容許消息數(shù)據(jù)的最大字節(jié)總數(shù),尚有近來一次執(zhí)行發(fā)送操作的進(jìn)程標(biāo)識符和時(shí)間、近來一次執(zhí)行接受操作的進(jìn)程標(biāo)識符和時(shí)間等。2、消息隊(duì)列的描述符UNIX中,每一種消息隊(duì)列均有一種稱為關(guān)鍵字(key)的名字,是由顧客指定的;消息隊(duì)列有一消息隊(duì)列描述符,其作用與顧客文獻(xiàn)描述符同樣,也是為了以便顧客和系統(tǒng)對消息隊(duì)列的訪問。二、波及的系統(tǒng)調(diào)用1.msgget()創(chuàng)立一種消息,獲得一種消息的描述符。關(guān)鍵將搜索消息隊(duì)列頭表,確定與否有指定名字的消息隊(duì)列。若無,關(guān)鍵將分派一新的消息隊(duì)列頭,并對它進(jìn)行初始化,然后給顧客返回一種消息隊(duì)列描述符,否則它只是檢查消息隊(duì)列的許可權(quán)便返回。系統(tǒng)調(diào)用格式:msgqid=msgget(key,flag)該函數(shù)使用頭文獻(xiàn)如下:#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>參數(shù)定義intmsgget(key,flag)key_tkey;intflag;其中:key是顧客指定的消息隊(duì)列的名字;flag是顧客設(shè)置的標(biāo)志和訪問方式。如IPC_CREAT|0400與否該隊(duì)列已被創(chuàng)立。無則創(chuàng)立,是則打開;IPC_EXCL|0400與否該隊(duì)列的創(chuàng)立應(yīng)是互斥的。msgqid是該系統(tǒng)調(diào)用返回的描述符,失敗則返回-1。2.msgsnd()發(fā)送一消息。向指定的消息隊(duì)列發(fā)送一種消息,并將該消息鏈接到該消息隊(duì)列的尾部。系統(tǒng)調(diào)用格式:msgsnd(msgqid,msgp,size,flag)該函數(shù)使用頭文獻(xiàn)如下:#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>參數(shù)定義:intmsgsnd(msgqid,msgp,size,flag)intmsgqid,size,flag;structmsgbuf*msgp;其中msgqid是返回消息隊(duì)列的描述符;msgp是指向顧客消息緩沖區(qū)的一種構(gòu)造體指針。緩沖區(qū)中包括消息類型和消息正文,即{longmtype;/*消息類型*/charmtext[];/*消息的文本*/}size指示由msgp指向的數(shù)據(jù)構(gòu)造中字符數(shù)組的長度;即消息的長度。這個(gè)數(shù)組的最大值由MSG-MAX()系統(tǒng)可調(diào)用參數(shù)來確定。flag規(guī)定當(dāng)關(guān)鍵用盡內(nèi)部緩沖空間時(shí)應(yīng)執(zhí)行的動作:進(jìn)程是等待,還是立即返回。若在標(biāo)志flag中未設(shè)置IPC_NOWAIT位,則當(dāng)該消息隊(duì)列中的字節(jié)數(shù)超過最大值時(shí),或系統(tǒng)范圍的消息數(shù)超過某一最大值時(shí),調(diào)用msgsnd進(jìn)程睡眠。若是設(shè)置IPC_NOWAIT,則在此狀況下,msgsnd立即返回。對于msgsnd(),關(guān)鍵須完畢如下工作:(1)對消息隊(duì)列的描述符和許可權(quán)及消息長度等進(jìn)行檢查。若合法才繼續(xù)執(zhí)行,否則返回;(2)關(guān)鍵為消息分派消息數(shù)據(jù)區(qū)。將顧客消息緩沖區(qū)中的消息正文,拷貝到消息數(shù)據(jù)區(qū);(3)分派消息首部,并將它鏈入消息隊(duì)列的末尾。在消息首部中須填寫消息類型、消息大小和指向消息數(shù)據(jù)區(qū)的指針等數(shù)據(jù);(4)修改消息隊(duì)列頭中的數(shù)據(jù),如隊(duì)列中的消息數(shù)、字節(jié)總數(shù)等。最終,喚醒等待消息的進(jìn)程。3.msgrcv()接受一消息。從指定的消息隊(duì)列中接受指定類型的消息。系統(tǒng)調(diào)用格式:msgrcv(msgqid,msgp,size,type,flag)本函數(shù)使用的頭文獻(xiàn)如下:#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>參數(shù)定義:intmsgrcv(msgqid,msgp,size,type,flag)intmsgqid,size,flag;structmsgbuf*msgp;longtype;其中,msgqid,msgp,size,flag與msgsnd中的對應(yīng)參數(shù)相似,type是規(guī)定要讀的消息類型,flag規(guī)定倘若該隊(duì)列無消息,關(guān)鍵應(yīng)做的操作。如此時(shí)設(shè)置了IPC_NOWAIT標(biāo)志,則立即返回,若在flag中設(shè)置了MS_NOERROR,且所接受的消息不小于size,則關(guān)鍵截?cái)嗨邮艿南?。對于msgrcv系統(tǒng)調(diào)用,關(guān)鍵須完畢下述工作:(1)對消息隊(duì)列的描述符和許可權(quán)等進(jìn)行檢查。若合法,就往下執(zhí)行;否則返回;(2)根據(jù)type的不一樣提成三種狀況處理:type=0,接受該隊(duì)列的第一種消息,并將它返回給調(diào)用者;type為正整數(shù),接受類型type的第一種消息;type為負(fù)整數(shù),接受不不小于等于type絕對值的最低類型的第一種消息。(3)當(dāng)所返回消息大小等于或不不小于顧客的祈求時(shí),關(guān)鍵便將消息正文拷貝到顧客區(qū),并從消息隊(duì)列中刪除此消息,然后喚醒睡眠的發(fā)送進(jìn)程。但假如消息長度比顧客規(guī)定的大時(shí),則做出錯(cuò)返回。4.msgctl()消息隊(duì)列的操縱。讀取消息隊(duì)列的狀態(tài)信息并進(jìn)行修改,如查詢消息隊(duì)列描述符、修改它的許可權(quán)及刪除該隊(duì)列等。系統(tǒng)調(diào)用格式:msgctl(msgqid,cmd,buf);本函數(shù)使用的頭文獻(xiàn)如下:#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>參數(shù)定義:intmsgctl(msgqid,cmd,buf);intmsgqid,cmd;structmsgqid_ds*buf;其中,函數(shù)調(diào)用成功時(shí)返回0,不成功則返回-1。buf是顧客緩沖區(qū)地址,供顧客寄存控制參數(shù)和查詢成果;cmd是規(guī)定的命令。命令可分三類:(1)IPC_STAT。查詢有關(guān)消息隊(duì)列狀況的命令。如查詢隊(duì)列中的消息數(shù)目、隊(duì)列中的最大字節(jié)數(shù)、最終一種發(fā)送消息的進(jìn)程標(biāo)識符、發(fā)送時(shí)間等;(2)IPC_SET。按buf指向的構(gòu)造中的值,設(shè)置和變化有關(guān)消息隊(duì)列屬性的命令。如變化消息隊(duì)列的顧客標(biāo)識符、消息隊(duì)列的許可權(quán)等;(3)IPC_RMID。消除消息隊(duì)列的標(biāo)識符。msgqid_ds構(gòu)造定義如下:structmsgqid_ds{structipc_permmsg_perm;/*許可權(quán)構(gòu)造*/shortpad1[7];/*由系統(tǒng)使用*/ushortmsg_qnum;/*隊(duì)列上消息數(shù)*/ushortmsg_qbytes;/*隊(duì)列上最大字節(jié)數(shù)*/ushortmsg_lspid;/*最終發(fā)送消息的PID*/ushortmsg_lrpid;/*最終接受消息的PID*/time_tmsg_stime;/*最終發(fā)送消息的時(shí)間*/time_tmsg_rtime;/*最終接受消息的時(shí)間*/time_tmsg_ctime;/*最終更改時(shí)間*/};structipc_perm{ushortuid;/*目前顧客*/ushortgid;/*目前進(jìn)程組*/us
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年高品質(zhì)衛(wèi)浴設(shè)備采購及安裝服務(wù)合同3篇
- 2024年資產(chǎn)權(quán)屬變更協(xié)議樣本文本版B版
- 2025年度博物館文物清潔與保養(yǎng)合同范本3篇
- 2024年版再婚夫妻解除婚姻關(guān)系合同版B版
- 2024年網(wǎng)絡(luò)安全監(jiān)控合作協(xié)議
- 2024年自然人短期貸款協(xié)議3篇
- 2025年度承包魚塘養(yǎng)殖與科研合作合同3篇
- 2025年度廚師餐飲行業(yè)人才培養(yǎng)與合作合同3篇
- 2025年度出口退稅證明開具與稅務(wù)籌劃合同3篇
- 2024版數(shù)據(jù)服務(wù)合同范本
- 托育機(jī)構(gòu)年度計(jì)劃
- 湖南省長沙市中學(xué)雅培粹學(xué)校2025屆七年級數(shù)學(xué)第一學(xué)期期末調(diào)研模擬試題含解析
- 股權(quán)質(zhì)押登記授權(quán)委托書
- 混凝土采購運(yùn)輸組織供應(yīng)、運(yùn)輸、售后服務(wù)方案
- 2024糖尿病酮癥酸中毒診斷和治療課件
- 審計(jì)職業(yè)生涯規(guī)劃書
- 2024-2029年中國脊柱側(cè)彎支具行業(yè)市場現(xiàn)狀分析及競爭格局與投資發(fā)展研究報(bào)告
- 新媒體部門崗位配置人員架構(gòu)圖
- 認(rèn)識各種樂器
- 神農(nóng)架自然保護(hù)區(qū)森林生態(tài)系統(tǒng)服務(wù)價(jià)值評估
評論
0/150
提交評論