linux中的c語言編程-消息傳遞系統(tǒng)_第1頁
linux中的c語言編程-消息傳遞系統(tǒng)_第2頁
linux中的c語言編程-消息傳遞系統(tǒng)_第3頁
linux中的c語言編程-消息傳遞系統(tǒng)_第4頁
linux中的c語言編程-消息傳遞系統(tǒng)_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、操作系統(tǒng)第五次實(shí)驗(yàn)張焓1. 實(shí)驗(yàn)名稱:項(xiàng)fh消息隊(duì)列通信2. 實(shí)驗(yàn)?zāi)康模悍?wù)進(jìn)程奴有一個(gè),接收個(gè)客戶進(jìn)程以消息形式發(fā)出的14題,接收鍵盤輸入作為回答, 再以消息形式送給提問的程序。各客戶進(jìn)程接收鍵盤輸入作為問題,以消息形式發(fā)給服務(wù)進(jìn)程,等待接收服務(wù)進(jìn)程發(fā)來 的回答消息,再開始下-輪的循環(huán)。a. 程序不停執(zhí)行,直到用戶川ctrl+c殺死進(jìn)程b. 程序不停執(zhí)行,過到用戶鍵入end,進(jìn)程結(jié)朿執(zhí)行3. 實(shí)驗(yàn)方法(1>首先編寫客廣進(jìn)程:妲含需要用到的頭文件,并定義結(jié)構(gòu)體msgform作為報(bào)文結(jié)構(gòu)用于存放報(bào)文:include <unistd.h>#include <stdlib.h

2、>include <stdio.h>#lnclude <string.h>#include<sys/nsg.h>struct msgform"long ntype; char ntext256;(2) 作一些定義及聲明:tnt nain()struct nsgforn nsg; tnt runnlng=l;int pid;tnt nsgqid=-1,reval=-1; char buffer256;(3) 創(chuàng)建消息隊(duì)列,并添加必要的錯(cuò)誤處理,標(biāo)識(shí)碼1234:nsgqld=nsgget(key_t)1234,0666|ipc_creat); i

3、f(nsgqid=-l)printf(mnsg create error!n"); exu(exit-failure);(4) 接收消息隊(duì)列中的報(bào)文,添加必要的錯(cuò)誤處理,并在屏幕打印接收到的報(bào)文消息, 為了方便觀察,我們在這甩順帶顯示一下進(jìn)程的pid。另外,在a情況下此段程序如閣,在 b情況卜,將注釋部分的注釋符去掉即可:pid=getpid(); nsg.ntype = 0; while(running)if(nsgrcv(nsgqid > &nsg,256,ife)=-l)prlntf("client:nsg receive error!nm); extt

4、(exit-failure);prlntf("client:receive fron pid xd you write:xsnm,pld,nsg.ntext);/if(strncnp(nsg.ntextf ”end”, 3) = 0)/running =6;(5) 清空并刪除消息隊(duì)列,并且添加必要的錯(cuò)誤處理:iif(nsgctl(nsgqid,ipc_rmid,0)=-1)prlntf(mnsgctl failednm); exit(exitfailure);i (6) 如整個(gè)程序正常運(yùn)行,則退出進(jìn)程:extt(exit_success);, (7) 編寫服務(wù)進(jìn)程:包含需耍用到的尖文

5、件,并定義結(jié)構(gòu)體msgform作為報(bào)文結(jié)構(gòu)用于存放報(bào)文(同):#include <unistd.h>include <stdltb.h>#tnclude <stdlo.h>井include <strtng.h>#tnclude<sys/nsg. h>|struct nsgfornlong ntype; char ntext256;在服務(wù)進(jìn)程中啟動(dòng)客戶進(jìn)程:int nain()int child;if(child=fork()=0)execlp(h./clientm,(char*) 6);(9) 作一些定義及聲明:struct nsgf

6、orn nsg; int running=l; int pld;int nsgqld=-1f reval=-1; char buffer256;(10) 創(chuàng)建消息隊(duì)列,并添加必要的錯(cuò)誤處理,標(biāo)識(shí)碼1234:nsgqld=nsgget(keyt)1234,0666 丨ipccreat); if(nsgqid=-l)printf(wnsg create error!n"); extt(exit failure); '(11) 從鍵盤輸入一組字符串,存入臨吋的字符串?dāng)?shù)組作為報(bào)文內(nèi)容,并定義報(bào)文類型。 為方便觀察,在屏幕打印服務(wù)進(jìn)程接收到的信總的報(bào)文消思,為了方便觀察,我們在這里順

7、帶顯示一下進(jìn)程的pid:pid=getpid();nsg.ntype=0;while(runnlng)printf(wenter:w);fgets(guffer2s6,st(hn);prtntf(hserver:receive ftor pid xd you write:xsnm,pidfbuffer);strcpycnsg.ntext,buffer);nsg.ntype=l;(12) 將報(bào)文寫入到消息隊(duì)列中的,添加必耍的錯(cuò)誤處理。另外,在a情況下此段程序如 圖,在b情況下,將注釋部分的注釋符去掉即可:if(nsgsnd(nsgqxd,&nsg,256,0)=-1)printf(mns

8、g send error!n);cxit(exit failure);/if (strncnp(nsg .ntext, -end*1 f3)=0)/runnings©sleep(l);|(i3進(jìn)程執(zhí)行完畢p,正常退出。 exit(exitsuccess);(14在命令行中運(yùn)行:情景a.iv ubuntu 副本正在運(yùn)行-oracle vm virtualboxx- 終m文件(f) ««(e)査«(v)授累(s)終纗(t)探助hanghan-virtualbox:*$ gcc server.c -o server server.c: in function

9、'rain*:server.c:18:3: warning: null argument where non-null required (argument 2) -wno nnullexeclp("./client",(char*) 0);aserver.c:18:3: warning: not enough variable arguments to fit a sentinel -wforna t«han0han-vtrtualbox>/serverenter:asdserver:receivefromptd22472youwrite:asdc

10、laent:receivefronptd22473youwrlte:asdenter:endserver:receivef rowpld22472youwrlte:endclient:receivefronptd22473youwrlte:endhanighan-virtualbox:*$ gcc client.c -o client enter:achanhdn-vl.rtudlbox:*$ |ubuntu kylind & 雖,名 ±j right ctrl情景b.ubuntu 副本正在運(yùn)行-oracle vm virtualbox 管理控制視圖熱鍵設(shè)備幫助函圈 t毒困

11、*) 13:25.c -o .c -0serverserver:receivefrompld22611youwrite:awfclient:receivefromptd22612youwrlte:awfenter:endserver:receivefrompid22611youwrtte:endclient:receivefromptd22612youwrlte:endian-vlrtualbox:*$x|_ 終端文件(f)編輯(e)查右(v)搜索(s)終端(t)幫助(h) anhan-virtualbox:-$ gcc client.c -o clienthanohan-vlrtua1.bo

12、x:*$ gcc server, server.c: in functionserver.c:18:3: warning: null argument where non-null required (argument 2) nnullexecxp("./cltent*f(char*) 0);aserver.c:18:3: warning: not enough variable arguments to fit a sentinel -wforna t=hanhan-vlrtualbox:*$ ./server enter:awf霤夕喔9楚豊皇墾 right ctrl4. 實(shí)驗(yàn)步驟

13、(1) 啟動(dòng)計(jì)算機(jī)并運(yùn)行visual studio 2015;(2) 打開終端進(jìn)行程序書寫多線程計(jì)算舉證的程序代碼;(3) 牛成解決方案后再命令提示行中運(yùn)行編譯得到的可執(zhí)行程序;分析運(yùn)行hi現(xiàn)的問題;(5) 觀察運(yùn)行結(jié)果,丼思考;(6) 退出,并寫出實(shí)驗(yàn)報(bào)告;5. 主要結(jié)論在進(jìn)程間的通信實(shí)驗(yàn)屮,我采川了內(nèi)存共亨的方式將父子進(jìn)程進(jìn)行了通信,在本次實(shí)驗(yàn), 我成功的使用了消息隊(duì)列使得兩進(jìn)程間能夠通信。6. 分析和討論消息隊(duì)列就是一個(gè)消息的鏈表??梢园严⒖醋饕粋€(gè)記錄,具有特定的格式以及特定的 優(yōu)先級(jí)。對(duì)消息隊(duì)列有寫權(quán)限的進(jìn)程討以叫消息隊(duì)列中按照一定的規(guī)則添加新消息;對(duì)消息 隊(duì)列柯讀權(quán)限的進(jìn)程則可以從

14、消息隊(duì)列屮讀走消息。消息隊(duì)列是隨內(nèi)核持續(xù)的。消息隊(duì)列技術(shù)足分布式應(yīng)川間交換倍息的一種技術(shù)。消息隊(duì)列可駐留在內(nèi)存或磁盤上, 隊(duì)列存儲(chǔ)消息直到它們被應(yīng)用程序讀走。通過消息隊(duì)列,應(yīng)用程序可獨(dú)立地執(zhí)行-它們不需 要知道彼此的位置、或在繼續(xù)執(zhí)行前不需要等待接收程序接收此消息。附錄:client.c:#include<unistd. h>#include<stdlib. h>林include<stdio. h>#include<string. h>#includc<sys/msg- h>structmsgfornilong mtypo; char

15、 mtext256;int mainostructmsgform msg; int running=l; int pid;int msgqid二-1, reval=-l; char buffer256:msgqid=msgget(key_t)1234, 06661ipc_creat): if(msgqid=-l)printf(msg create error!n); exit(exit_fallure);pid=getpid(); msg. mtype = 0; while (running)if (msgrcv (msgqid, &msg, 256, 1, 0)二=-1)printf

16、(client:msg receive error!n); exit(exit_fatlure):printf("client:receive from pid %d you write:%snz pid, msg. mtext); if (strncmp(msg. mtext, end”,3) = 0)running = 0;if (rasgctl (msgqid, ipc一rmid, 0)=-1)printf cmsgct failedrt); exit(exit failure);exit (exit success);server.c:#include<unistd.h

17、> #include<stdlib. h> #includc<stdio. h> #includc<string. h> #include<sys/msg. h> structinsgform long mtypc; char mtcxt256;int main()int child;if (child=fork ()=0)execlpc. /client",(char*) 0);structinsgform msg; int running=l; int pid;int msgqid=-l, reval=-l; char buffer256:msgqid=msggct(kcy_t) 1234, 0666|ipc_creat): if (msgqid=-l)printfcmsg create error! n,z); exit(exit failure);pid=getpid(): msg. intype=0; while (running)printf(enter:); fgets (buffer, 256, stdi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論