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ù)免費閱讀

下載本文檔

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

文檔簡介

1、操作系統(tǒng)第五次實驗張焓1. 實驗名稱:項fh消息隊列通信2. 實驗?zāi)康模悍?wù)進(jìn)程奴有一個,接收個客戶進(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. 實驗方法(1>首先編寫客廣進(jìn)程:妲含需要用到的頭文件,并定義結(jié)構(gòu)體msgform作為報文結(jié)構(gòu)用于存放報文: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)建消息隊列,并添加必要的錯誤處理,標(biāo)識碼1234:nsgqld=nsgget(key_t)1234,0666|ipc_creat); i

3、f(nsgqid=-l)printf(mnsg create error!n"); exu(exit-failure);(4) 接收消息隊列中的報文,添加必要的錯誤處理,并在屏幕打印接收到的報文消息, 為了方便觀察,我們在這甩順帶顯示一下進(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) 清空并刪除消息隊列,并且添加必要的錯誤處理:iif(nsgctl(nsgqid,ipc_rmid,0)=-1)prlntf(mnsgctl failednm); exit(exitfailure);i (6) 如整個程序正常運行,則退出進(jìn)程:extt(exit_success);, (7) 編寫服務(wù)進(jìn)程:包含需耍用到的尖文

5、件,并定義結(jié)構(gòu)體msgform作為報文結(jié)構(gòu)用于存放報文(同):#include <unistd.h>include <stdltb.h>#tnclude <stdlo.h>井include <strtng.h>#tnclude<sys/nsg. h>|struct nsgfornlong ntype; char ntext256;在服務(wù)進(jìn)程中啟動客戶進(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)建消息隊列,并添加必要的錯誤處理,標(biāo)識碼1234:nsgqld=nsgget(keyt)1234,0666 丨ipccreat); if(nsgqid=-l)printf(wnsg create error!n"); extt(exit failure); '(11) 從鍵盤輸入一組字符串,存入臨吋的字符串?dāng)?shù)組作為報文內(nèi)容,并定義報文類型。 為方便觀察,在屏幕打印服務(wù)進(jìn)程接收到的信總的報文消思,為了方便觀察,我們在這里順

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) 將報文寫入到消息隊列中的,添加必耍的錯誤處理。另外,在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在命令行中運行:情景a.iv ubuntu 副本正在運行-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 副本正在運行-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. 實驗步驟

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

14、消息隊列屮讀走消息。消息隊列是隨內(nèi)核持續(xù)的。消息隊列技術(shù)足分布式應(yīng)川間交換倍息的一種技術(shù)。消息隊列可駐留在內(nèi)存或磁盤上, 隊列存儲消息直到它們被應(yīng)用程序讀走。通過消息隊列,應(yīng)用程序可獨立地執(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等.壓縮文件請下載最新的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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論