Linux進程通信:命名管道FIFO小結(jié)_第1頁
Linux進程通信:命名管道FIFO小結(jié)_第2頁
Linux進程通信:命名管道FIFO小結(jié)_第3頁
Linux進程通信:命名管道FIFO小結(jié)_第4頁
Linux進程通信:命名管道FIFO小結(jié)_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Uexx進程通信:命名管道FIFO小結(jié)LL〃x下進程之間通信可以用命名管道F/F。完成。命名管道是一種特殊類型的文件,因為LM〃x中所有事物都是文件,它在文件系統(tǒng)中以文件名的形式存在。在程序中,我們可以使用兩個不同的函數(shù)調(diào)用來建立管道:^include<sgs/stat?h〉it^itw\kfifo(co八stckar為67c八4Hac》i^odejtMode);Mk八odc(co八優(yōu)char興八〃M也ModestMode|SJFIFO, O);下面先來創(chuàng)建一個管道:[cpp]Hewp⑶八copg#Mclud?!磗tdio.h〉#iccbdc<stdlib.h>#McLde<sgs/tgpcs.k>#Mcln4c<sys/stat.h>iint{iiatres=Mkfifo(〃/tMp/Mg_fifo〃,0777);q. if(res==69 {11.priiatf(uFIFOcreated/^1}:22. )13.cxit(EXIT_SUCCESS);X4.)編譯這個程序:gcc一。fifo^.cfifo運行這個程序:$./fif。工X8. {X9. (stderr"Sorry,createclientfifofailure!/八〃);20 ex/*EX/匚FAILURE);2L).serveirjifojd=op/(SER\/ER_FIFO_NAME,。一WRONLY);.if(scn/cir_fifo_f4==-1){6. fpiri八tRstdew,"Sorirg,openserverfifofaibr。!/八〃);6xit(EXIT^FAlLURE);)273C). sp-i八tf(Msg.data)"Hdlofrom%d,,JMsg.c(ient_picl);pirMtf(〃%dsc八t%s i^sg.client_pid,w^sg.data);wHtc(server_fifo_fd)&Msg』size。f(msg));cliei^t_fifo_fd二open(ctie^t_fifo^a?CLRDONLY);if(d也八t_fifo_fd==T)TOC\o"1-5"\h\z{fpYintf(stAc”」So“g)clientfifoopc八faibre!/八〃);38. cxit(EXIT_FAILURE);)res=iread(c(ieAt_fifo_fd)&n/\sg)s/2eof(H/1sg));if(res>O){p/Mtf(〃匕ccci\/cd:%s//-xsg/ntn);}45c(ose(clieht_fifo_fd);c/osc(servcr__frfo_fd);〃八/譏k(c〃c八t_fifo_八amc);49.50.exit(EX【T_SUCCESS);編譯程序:gcc一。serverservercgcc一。clientcli&i^t.c測試這個程序,我們需要一個服務器進程和多個客戶進程。為了讓多個客戶進程在同一時間啟動,我們使用了$,M\命令:[root@localk\o^tckapcir。]#./server&[2.6]SI71[root@localkostchape丫12]#forii八22345;do./client&done[27]5172[22]Si73[29]5274[50]5275[31]SI76[root@localko£tchaper12]#5172sentHellofrom5272wccivcd:HELL。FROM5272SX73SC八土Hellof/OhASX73received:HELL。FROMS173SI74sentHellof/OMSI74received:HELL。FROM52745275sentHellofnw5275received:HELL。FROM52755276sentHellohow\5276r6c&ived:HELLOFROM5工76分析這個例子,服務器以只讀模式創(chuàng)建它的曰F。并阻塞,直到第一個客戶以寫方式打開同一現(xiàn)個F/F。來建立連接為止。此時,服務器進程解除阻塞并執(zhí)行s/eep語句,這使得來自客戶的數(shù)據(jù)排除等候。在實際應用程序中,應該把s/ccp語句刪除,這里面只是為了演示當有多個客戶請求同時到達時,程序的正確操作方法。與此同時,在客戶端打開服務器F/F。后,它創(chuàng)建自己唯一的一個命名管道以讀取服務器返回的數(shù)據(jù)。完成這些工作后,客戶發(fā)送數(shù)據(jù)給服務器(如果管道滿或服務器仍處于休眠就阻塞),并阻塞于對自己F/F。的七4d調(diào)用上,等待服務器響應。接收到來自客戶的數(shù)據(jù)后,服務器處于它,然后以寫的方式打開客戶管道并將處理后的數(shù)據(jù)返回,這將解除客戶端的阻塞狀態(tài),客戶程序就可以從自己的管道里面讀取服務器返回的數(shù)據(jù)了。整個處理過程不斷重復,直到最后一個客戶關(guān)閉服務器管道為止,這將使服務器的七“d調(diào)用失?。ǚ祷?。),因為已經(jīng)沒有進程以寫方式打開服務器管道了。如果這是一個真正的服務器進程的話,它還需要繼續(xù)等待其他客戶的請求,我們就需要對它進行修改,有兩種方法:(2)對它自己的服務器管道打開一個文件描述符,這樣%4d調(diào)用將阻塞而不是返回。。(2)當%“d調(diào)用返回。時,關(guān)閉并重新打開服務器管道,使服務器進程阻塞在八調(diào)用處以等待客戶的到來,就像它最初啟動時那樣。用k命令查看所創(chuàng)建的管道Is-IF^rwxr-xr-x2rootrootO05-OS20:2。/tMp/Mg_fifo注意:k命令的輸出結(jié)果中的第一個字符為p表示這是一個管道。最后的|符號是由k命令的-F選項添加的,它也表示是這是一個管道。雖然,我們所設(shè)置的文件創(chuàng)建模式為“0777。但它被用戶掩碼(um^sk)設(shè)置(。22)給改變了,這與普通文件創(chuàng)建是一樣的,所以文件的最終模式為755。打開F/F。一個主要的限制是,程序不能是。_RDWR模式打開曰F。文件進行讀寫操作,這樣做的后果未明確定義。這個限制是有道理的,因為我們使用F/F。只是為了單身傳遞數(shù)據(jù),所以沒有必要使用。一RDWR模式。如果一個管道以讀/寫方式打開曰F。,進程就會從這個管道讀回它自己的輸出。如果確實需要在程序之間雙向傳遞數(shù)據(jù),最好使用一對F/F。,一個方向使用一個。當一個進程被阻塞時,它并不消耗CPU資源,這種進程的同步方式對CPU而言是非常有效率的。有關(guān)Lmux下命名管道FIFO的讀寫規(guī)則可以參見之前所寫的一篇文章:L譏“X命名管道F/F。的讀寫規(guī)則。一、實驗:使用FIFO實現(xiàn)進程間通信兩個獨立的程序:生產(chǎn)者程序,它在需要時創(chuàng)建管道,然后盡可能快地向管道中寫入數(shù)據(jù)。消費者程序,它從F/F。中讀取數(shù)據(jù)并丟棄它們。生產(chǎn)者程序fif。2c[cpp] copg〈stdio.h〉#include<stdlib.h>〈stiri八g.h〉#Mcfe<fcntl.h>^ii^clude(o.#McL4c〈sgs/tgpes.h〉<sgs/stat.k>q.#dcfi八。FIFO_NAME"/tmp/Li八iax/9 13UFFER_SIZEPIPE__13UF工工.#defMeTEN_ME&(1024*2024*2。)Mt(25 int pipe_fd;X6. Mt res;int o?en_HAode=CLWRONLY;26 Mt bytes=<9;ck\airbuffer[13UFFE^SIZE+1];if?ccess(F/FO_NAMEjF_OK)二二T)TOC\o"1-5"\h\z(res=Mkfifo(FlFCLNAME)0777);if(res/=O){2.7. fpri八tf(stdcH)〃CobdWi^otcreatefifo%s/八〃/FIFO_NAME);2g. cxit(EX1匚FAILURE);26 )30. )3X.pirMtf("Pirocess%dope八MgFIFOO_WRONLY/八〃)getpid。);pipe_fd=opcc(FIFO_NAME)opcn_Mode);piri八tf("Process%dresu/t%d/"「gctpict(),pipc_f4);if(pipc_fd!=T){wk/7c(bytes<TEN_MEG)(res=wiritc(pipc_fcl)buffer,B(JFFER_S/ZE);if(res==-1)TOC\o"1-5"\h\z{error。八pipe/八〃);cxit(EXIT_FAILURE);)bytes十二res;1c(ose(pipc_fd);)else{cxit(EXIT_FAILURE);)pH八tf("Process%dfMisk/八〃)getpid。);exit(EXIT_SUCCESS);}消費者程序行foBc:[epp]Hewplaihcopg#Sc(ndc<stdio.W>#McLdc〈stcUib.h〉#Mdnde〈stiri八g.h〉#Mclndc<fc八"k>#ScI(a4c#Sc(b(de<sgs/tgpcs.k>#McL4c<sys/stat.k>q.#dcfMcFIFO_NAME"/tmp/LMux/mg_fif。"3#&行八c13UFFER_SIZEPIPEJ3UF21.22.X4.25.17.28.19.2。21.22.2324.25.2.6,27.22.2730.31.32.33.34.3S.36.37.38.39.4。4L42.Mt{Mtpipc_fd;intres;iv\topcAjAAodc=CLRDONLY;ckarb"feir[BUFFER_SIZE+1];Mtbgtes=。MCMSct(bh(ffd/OLsizeof(biAffer));pn'八tf(〃FVocess%dopei八ingFIFOO_RDONLY/八〃)gctpid());pipe_fd=opcMFlFO_NAME)o?m_Modc);pirMtf("Process%dresult%d/">getpid())pipc_fd);if(pipc_fd/=-1)(do{res=read(pipe_fd,buffer,BUFFER_S/ZE);bgtes十=res;}wk陽Vcs>O);c(osc(pipc_fd);)eke(cxit(EXIT_FAILURE);)pn'htf(〃Proccss%dfi八ished,%dbytesrc〃d/八〃)gctpid())bytes);cxit(EX工SUCCESS);編譯這兩個程序:gcc一。fifo2fifo2.cgcc一。fifo3fifo3.c運行這兩個程序:[rootf^localkostckapcr工2j#./fifo2& 今后臺執(zhí)行,寫數(shù)據(jù)[2J2"2工Process23222opc八MgFIFOO_WRONLY[root@locafhostchapcS2]#time./肝。32讀數(shù)據(jù)Process24255opci八MgFIFOCLRDONLYProcess23222result3Process24255result3Process23222finishProcess24255finished,1048576。bytesread[2]-Do八。 ,/fifo2realOm9.224suserOw\O,OOOs>sgsOw\O.^7^s以上兩個程序均是使用阻塞模式曰F。。LM,x會安排好這兩個進程之間的調(diào)試,使它們在可以運行的時候運行,在不能運行的時候阻塞。因此,寫進程將在管道滿時阻塞,讀進程將在管道空時阻塞。虛擬機上,力,mc命令顯示,讀進程只運行了。2秒的時間,卻讀取了工0M字節(jié)的數(shù)據(jù)。這說明管道在程序之間傳遞數(shù)據(jù)是非常有效的。二、實驗:使用FIFO的客戶/服務器應用程序利用F/F。實現(xiàn)一個客戶/服務器的應用程序,服務器進程接受請求,對它們進程處理,最后把結(jié)果數(shù)據(jù)返回給發(fā)送請求的客戶方。首先建立一個頭文件c能八七人,它定義了客戶和服務器程序都要用到的數(shù)據(jù)結(jié)構(gòu),并包含了必要的頭文件。[epp]HewplaMcopg#kcfe〈stdio.h〉<std(ib.h〉認g.k>#Mc(ia4c〈fcctLh〉(d.#McLdc<sgs/tgpcs.h>#inc【ndc<sgs/stat.h〉q.#AcfMcSERVER_F【FO_NAME"/±Mp/Li八認x/chapcir:L2/scn/CY_fif。"20.#dcfi八cCLIENT_FIFO_NAME"/tMp/LM(AX/chapciri2/c(icAt_%d_fif。"11.#dcfMeBUFFER_SIZEPIPE_8UF#dcfincMESSACE_SIZE2。#def證cNAME_SIZE256typedefstructMessage.{. pidjtcliei^t_pid;chardata[MESSAGE_SIZE+X]j2。Message;接下來是服務器程序scrvccc,在這一部分,是以只讀阻塞模式打開服務器管道,用于接收客戶發(fā)送過來的數(shù)據(jù),這些數(shù)據(jù)采用messogc結(jié)構(gòu)體封裝。[epp]viewplaincopg#Mclndc"clic八t.h"int用4,八01ietscrvCK_fifo_fd;intc(ic八Mtres;q.ck\arcIient_fifo」\amc[NAME_SIZE];311.Messageksg;X3. 來p;if(Mkfifo(SERVER_FIFO_NAME)0777)==一2)TOC\o"1-5"\h\z{17. fprih"Song,createserverfifofaiLsc!/八〃);28. exi^EXHLFA/LURE);19. )2。22.serveirjifojd=op"(SERVER_FIFO_NAME,CLRDONLY);22.if(scn/er_fifo_f4二二-2)2.3, {fpiri八tf(stdc也"Song〉serverfifoopenfaibir。!/八〃);. cxit(EXIT_FAILURE);}s(cep(5);3t9.wk/7c(res=ircad(scirver_fifo_fd)&hsg

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論