管道通信機(jī)制與消息緩沖機(jī)制_第1頁
管道通信機(jī)制與消息緩沖機(jī)制_第2頁
管道通信機(jī)制與消息緩沖機(jī)制_第3頁
管道通信機(jī)制與消息緩沖機(jī)制_第4頁
管道通信機(jī)制與消息緩沖機(jī)制_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持.11文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持.實(shí)驗(yàn)題目管道通信機(jī)制和消息緩沖機(jī)制小組合作姓名班級一、實(shí)驗(yàn)?zāi)康?、理解和掌握管道通信機(jī)制中使用的系統(tǒng)調(diào)用命令的格式和如何利用系統(tǒng)調(diào)用命令進(jìn)行進(jìn)程通信編程。2、理解和掌握消息緩沖機(jī)制中使用的系統(tǒng)調(diào)用命令的格式和如何利用系統(tǒng)調(diào)用命令進(jìn)行進(jìn)程通信編程。二. 實(shí)驗(yàn)環(huán)境1、VMware Workstation工作平臺 2、Linux 系統(tǒng)三、實(shí)驗(yàn)內(nèi)容與步驟 一、管道通信機(jī)制1、無名管道的通信(1) 創(chuàng)建無名管道的格式 #i nclude<sys/t yp es.h>

2、#in cludevct yp e.h> #in cludev uni std.h> int pip e(i nt filedes2);正確返回:0;錯誤返回:-1。(2)無名管道pipe ()的使用16.1、使用無名管道pipe ()進(jìn)行父子進(jìn)程之間的通信源程序代碼如下:#in cludevsys/t yp es.h> #in cludevct yp e.h> #i ncludevu ni std.h> int pip e(i nt filedes2);char paren t="A message to pip e'com mun icati

3、o n.n"mai n()int pid,cha n12;char buf1OO;pip e(cha n1);pid=fork();if(p idvO)prin tf("to create child errorn");exit(1);if(p id>0)close(cha n10);pnntf("parent p rocess sends a message to child.n");write(cha n11, paren t,sizeof( pare nt);close(cha n11);printf("parent p

4、rocess waits the child to termi nate.'n");wait(0);printf("parent p rocess termi nate.'n");elseclose(cha n11);read(cha n10,buf,100);prin tf("The message read by child p rocess from p are ntis:%s.rT'buf);close(0);prin tf("child p rocess termi nate n");實(shí)驗(yàn)運(yùn)行結(jié)果如圖

5、所示:2、以命令行為參數(shù)的管道通信(1)命令格式#in clude<stdio.h> #i nclude<sys/t yp es.h> #in clude<ct yp e.h>FiLe popen(const char cmdstri ng,c onst char typ e);(2) 打開一個以命令行為參數(shù)的管道文件,完成進(jìn)程之間的通信16.2、以命令行為參數(shù)的管道文件的示例假設(shè)有一個可執(zhí)行程序chcase從標(biāo)準(zhǔn)輸入設(shè)備讀字符,將小寫字母轉(zhuǎn)換成大寫字母并進(jìn)行輸出。主程序使用popen創(chuàng)建管道,實(shí)現(xiàn)將某文本文件中的字母轉(zhuǎn)換成大寫字母,期中的文本文件名作為參數(shù)

6、傳進(jìn)來。源程序代碼如下:#in clude<sys/wait.h>#in clude<stdio.h>#defi ne MAXLINE 100int main (i nt argc,char*argv)char lin eMAXLINE;FILE*fpi n, *fpout;if(argc!=2)fprin tf(stderr,"usage:a.out <p ath name>n");exit(1);if(fpi n=fopen (argv1,"r")=NULL)fprin tf(stderr,"ca n&#

7、39;t open %sn",argv1); exit(1);if(fpout=popen ("/root/LiFa ng/chcase.exe","w")=NULL)fpri ntf(stderr," popen errorn"); exit(1);while(fgets(li ne,MAXLINE,fpi n) )!=NULL)if(fputs(li ne,fpout)=EOF)fprin tf(stderr,"f puts error to pip e.n"); exit(1);if(ferror(

8、fpi n)fpri ntf(stderr,"fgets error.n");exit(1);if(p close(fpout)=-1)fpr in tf(stderr," pciose error.'n");exit(1);exit(0);實(shí)驗(yàn)運(yùn)行結(jié)果如下圖所示:3、有名管道的通信(1)創(chuàng)建一個有名管道的系統(tǒng)調(diào)用 mknod() #i nclude<sys/t yp es.h> #i nclude<sys/stat.h> #i nclude<u ni std.h> #in cludevfc ntl.h>

9、int mknod (const char * p ath name,mode_t mode ,dev_t dev);(2)打開一個有名管道open(pathname oflg);有名管道的使用16.3創(chuàng)建有名管道的例子源程序代碼如下:#in clude<fc ntl.h>char stri ng="this is a exa mple to show fifo com muni cati on" main( argc,argv)int argc;char * argv;int fd;char buf256;int i;mkn od("fifo&quo

10、t;,010777,0);if(argc=2)fd=o pen( "fifo",O_WRONL Y);elsefd=o pen( "fifo",O_RDONL Y);for(i=0;i<26;i+)if(argc=2)prin tf("n I have wrote:%s",stri ng);write(fd,stri ng,45);str in g0+=1;elseread(fd,buf,256);prin tf("nThe con text by I have read is:! %s",buf); buf

11、0='0'close(fd);試驗(yàn)運(yùn)行結(jié)果如下圖所示:二、消息緩沖機(jī)制1消息緩沖機(jī)制使用的數(shù)據(jù)結(jié)構(gòu)(1)消息緩沖區(qū) struct msgbuflong mtype;char mtextN;;(3) 消息頭結(jié)構(gòu) struct msgstruct msg * msg next;long msgt ype;short msgts;short msgs pot;2、消息緩沖的系統(tǒng)調(diào)用(1)建立一個消息隊(duì)列#in clude <sys/t yp es.h>#in clude <sys/i pc.h>#in clude <sys/msg.h>int ms

12、qid=msgget(key_t key,i nt msgflg);(2)向消息隊(duì)列發(fā)送消息#in clude<sys/smg.h>int msgs nd(i nt msqid,void * msgp ,size_t msgsz,i nt msgflg);(3)接收消息#in clude<sys/msg.h>int msgrcv(i nt msqid,void msgp ,size_t msgsz,l ong msgt yp ,i nt msgflg);(4) 取或送消息隊(duì)列的控制信息#in clude<sys/msg.h>int msgctl(i nt m

13、sqid,i nt cmd,struct msqid_ds * buf);3、利用消息緩沖機(jī)制的通信過程16.4創(chuàng)建一個私有消息隊(duì)列,一個進(jìn)程自己發(fā)送消息和接收消息。源程序代碼如下圖所示:實(shí)驗(yàn)運(yùn)行結(jié)果如下圖所示:16.5創(chuàng)建一個公共消息隊(duì)列,實(shí)現(xiàn)客戶進(jìn)程和服務(wù)者進(jìn)程之間進(jìn)行通源程序代碼如下:客戶進(jìn)程:#in elude vsys/t yp es.h>#in elude <sys/i pc.h>#in elude <sys/msg.h>#defi ne REQ 1#defi ne SVKE Y 75struct msgformlong mtype;char mtex

14、t256;;mai n()struct msgform msg;int msqid, pid,* pint;msqid=msgget(SVKE Y,0777);p id=get pi d();pin t=(i nt *)msg.mtext;*pin t=pid;msg.mt yp e=REQ;msgs nd(msqid,&msg,sizeof( in t),0);msgrcv(msqid,&m sg,256, pid,0);prin tf("clie nt received server's service result is server's pid

15、: %d .n",* pint);服務(wù)者進(jìn)程:#in clude <sys/t yp es.h> #in clude <sys/i pc.h> #in clude <sys/msg.h> #defi ne REQ 1 #defi ne SVKE Y 75 int msqid;struct msgform long mtype; char mtext256;mai n()struct msgform msg;int i,p id,* pint;msqid=msgget(SVKE Y,0777|IPC_CREAT);for(; ;)msgrcv(msq

16、id,&m sg,256,REQ,0);prin tf("server is doing the service for a clie nt. n");pin t=(i nt *)msg.mtext;pi d=* pint;prin tf("server receive clie nt's service request is clie nt's pid: %d .n", pid);msg.mt ype=pid;* pin t=get pi d();msgs nd(msqid,&m sg,sizeof( in t),0);

17、試驗(yàn)運(yùn)行結(jié)果如下圖所示:四、實(shí)驗(yàn)過程與分析分析:1、無名管道的通信父進(jìn)程先使用pipe(chan1)系統(tǒng)調(diào)用打開一個無名管道,之后創(chuàng)建一個子進(jìn)程。子進(jìn)程復(fù)制父進(jìn)程的打開文件表。為了正確通信,父進(jìn)程關(guān)閉讀通道close (chan10),子進(jìn)程分別關(guān)閉寫通道close (chan11)。父進(jìn)程向管道寫,子進(jìn)程從管道讀。完成一次通信后,父進(jìn)程分別關(guān)閉自己的寫或者讀通道,管道文件消失。次進(jìn)程先運(yùn)行父進(jìn)程,父進(jìn)程向無名管道寫一條消息,此時父進(jìn)程等待子進(jìn)程從管道讀取消息,直到子進(jìn)程結(jié)束,最后父進(jìn)程結(jié)束。2、以命令行為參數(shù)的管道通信本程序先運(yùn)行chcase.c程序,生成chcase.exe可執(zhí)行文件,次程

18、序的目的是將小寫字母轉(zhuǎn)換成大寫字母,主程序先打開文本文件,通過popen創(chuàng)建一個可寫管道,將命令行的chcase的輸入與管道的輸出連接起來,然后向管道輸入數(shù)據(jù),那么,命令行就可以通過管道連接收 文本文件的數(shù)據(jù)了,可實(shí)現(xiàn)將文本文件中的小寫字母轉(zhuǎn)換成大寫字 母。3、有名管道的通信進(jìn)程間使用有名管道實(shí)現(xiàn)通信時,必須有三次同步。第一次是打 開同步。當(dāng)一個進(jìn)程以讀方式打開有名管道時,若已有寫者打開過, 則喚醒寫著后繼續(xù)前進(jìn),否則,睡眠等待寫者。當(dāng)一個進(jìn)程以寫方式 打開有名管道時,若以有讀者打開過,則喚醒讀者繼續(xù)前進(jìn),否則等 到讀者。第二次是讀寫同步。其同步方式與pipe相同。允許寫者超前讀者1024個字符。當(dāng)一次寫超過1024時,超前的字符要寫入時, 超前的字符要寫入時,則寫者必須等待,讀者從有名管道時,若沒有 可讀則等待。若有數(shù)據(jù)可讀,讀完后要檢測有無寫者等待。若有喚醒 寫者。而且要求讀寫兩方面隨時檢查通信的另一方是否還存在,一旦有一方不存在,應(yīng)立即終止通信過程。第三次是關(guān)閉同步。當(dāng)一個寫 進(jìn)程關(guān)閉有名管道時,若發(fā)現(xiàn)有進(jìn)程睡眠等待從管道讀,則喚醒它, 被喚醒進(jìn)程立即從讀調(diào)用返回。當(dāng)一個讀進(jìn)程有名管道時,若發(fā)現(xiàn)有 進(jìn)程睡眠等待向管道寫,則喚醒它,并向他發(fā)一個指示錯誤條件的信 號后返回,最后一個關(guān)閉有名管道的

溫馨提示

  • 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

提交評論