linux下的消息管道的聊天程序?qū)崿F(xiàn)項目_第1頁
linux下的消息管道的聊天程序?qū)崿F(xiàn)項目_第2頁
linux下的消息管道的聊天程序?qū)崿F(xiàn)項目_第3頁
linux下的消息管道的聊天程序?qū)崿F(xiàn)項目_第4頁
linux下的消息管道的聊天程序?qū)崿F(xiàn)項目_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、作者:葉建敏 QQ:230817742 2010年4月22日 15:12:56 在linux下使用管道來進(jìn)行聊天的小程序1管道管道是一種最基本的IPC機(jī)制,由pipe函數(shù)創(chuàng)建:#inclludee int ppipee(innt ffileedess2);調(diào)用pippe函數(shù)數(shù)時在內(nèi)內(nèi)核中開開辟一塊塊緩沖區(qū)區(qū)(稱為為管道)用用于通信信,它有有一個讀讀端一個個寫端,然然后通過過filledees參數(shù)數(shù)傳出給給用戶程程序兩個個文件描描述符,filedes0指向管道的讀端,filedes1指向管道的寫端(很好記,就像0是標(biāo)準(zhǔn)輸入1是標(biāo)準(zhǔn)輸出一樣)。所以管道在用戶程序看起來就像一個打開的文件,通過rea

2、d(filedes0);或者write(filedes1);向這個文件讀寫數(shù)據(jù)其實是在讀寫內(nèi)核緩沖區(qū)。pipe函數(shù)調(diào)用成功返回0,調(diào)用失敗返回-1。開辟了管道道之后如如何實現(xiàn)現(xiàn)兩個進(jìn)進(jìn)程間的的通信呢呢?比如如可以按按下面的的步驟通通信。1. 父進(jìn)進(jìn)程調(diào)用用pippe開辟辟管道,得得到兩個個文件描描述符指指向管道道的兩端端。2. 父進(jìn)進(jìn)程調(diào)用用forrk創(chuàng)建建子進(jìn)程程,那么么子進(jìn)程程也有兩兩個文件件描述符符指向同同一管道道。3. 父進(jìn)進(jìn)程關(guān)閉閉管道讀讀端,子子進(jìn)程關(guān)關(guān)閉管道道寫端。父父進(jìn)程可可以往管管道里寫寫,子進(jìn)進(jìn)程可以以從管道道里讀,管管道是用用環(huán)形隊隊列實現(xiàn)現(xiàn)的,數(shù)數(shù)據(jù)從寫寫端流入入從讀端

3、端流出,這這樣就實實現(xiàn)了進(jìn)進(jìn)程間通通信。例管道#inclludee #inclludee #defiine MAXXLINNE 880int mmainn(vooid)int nn; int ffd22;pid_tt piid;char linneMMAXLLINEE; if (pippe(ffd) 00) perrror(piipe); exitt(1); If (piid = foork() 00) /* paarennt */ closse(ffd00); writee(fdd1, helllo worrldn, 122); waitt(NUULL); ellse /* chhildd

4、*/ closee(fdd1); n = reaad(ffd00, linne, MAXXLINNE); writee(STTDOUUT_FFILEENO, liine, n); retuurn 0;使用管道有有一些限限制:兩個進(jìn)程通通過一個個管道只只能實現(xiàn)現(xiàn)單向通通信,比比如上面面的例子子,父進(jìn)進(jìn)程寫子子進(jìn)程讀讀,如果果有時候候也需要要子進(jìn)程程寫父進(jìn)進(jìn)程讀,就就必須另另開一個個管道。請請讀者思思考,如如果只開開一個管管道,但但是父進(jìn)進(jìn)程不關(guān)關(guān)閉讀端端,子進(jìn)進(jìn)程也不不關(guān)閉寫寫端,雙雙方都有有讀端和和寫端,為為什么不不能實現(xiàn)現(xiàn)雙向通通信?管道的讀寫寫端通過過打開的的文件描描述符來來傳遞,因因此要

5、通通信的兩兩個進(jìn)程程必須從從它們的的公共祖祖先那里里繼承管管道文件件描述符符。上面面的例子子是父進(jìn)進(jìn)程把文文件描述述符傳給給子進(jìn)程程之后父父子進(jìn)程程之間通通信,也也可以父父進(jìn)程fforkk兩次,把把文件描描述符傳傳給兩個個子進(jìn)程程,然后后兩個子子進(jìn)程之之間通信信,總之之需要通通過foork傳傳遞文件件描述符符使兩個個進(jìn)程都都能訪問問同一管管道,它它們才能能通信。使用管道需需要注意意以下44種特殊殊情況(假假設(shè)都是是阻塞II/O操操作,沒沒有設(shè)置置O_NNONBBLOCCK標(biāo)志志):1. 如果果所有指指向管道道寫端的的文件描描述符都都關(guān)閉了了(管道道寫端的的引用計計數(shù)等于于0),而而仍然有有進(jìn)程

6、從從管道的的讀端讀讀數(shù)據(jù),那那么管道道中剩余余的數(shù)據(jù)據(jù)都被讀讀取后,再再次reead會會返回00,就像像讀到文文件末尾尾一樣。2. 如果果有指向向管道寫寫端的文文件描述述符沒關(guān)關(guān)閉(管管道寫端端的引用用計數(shù)大大于0),而而持有管管道寫端端的進(jìn)程程也沒有有向管道道中寫數(shù)數(shù)據(jù),這這時有進(jìn)進(jìn)程從管管道讀端端讀數(shù)據(jù)據(jù),那么么管道中中剩余的的數(shù)據(jù)都都被讀取取后,再再次reead會會阻塞,直直到管道道中有數(shù)數(shù)據(jù)可讀讀了才讀讀取數(shù)據(jù)據(jù)并返回回。3. 如果果所有指指向管道道讀端的的文件描描述符都都關(guān)閉了了(管道道讀端的的引用計計數(shù)等于于0),這這時有進(jìn)進(jìn)程向管管道的寫寫端wrritee,那么么該進(jìn)程程會收到到

7、信號SSIGPPIPEE,通常常會導(dǎo)致致進(jìn)程異異常終止止。4. 如果果有指向向管道讀讀端的文文件描述述符沒關(guān)關(guān)閉(管管道讀端端的引用用計數(shù)大大于0),而而持有管管道讀端端的進(jìn)程程也沒有有從管道道中讀數(shù)數(shù)據(jù),這這時有進(jìn)進(jìn)程向管管道寫端端寫數(shù)據(jù)據(jù),那么么在管道道被寫滿滿時再次次wriite會會阻塞,直直到管道道中有空空位置了了才寫入入數(shù)據(jù)并并返回。管道的這四四種特殊殊情況具具有普遍遍意義2.管道的的聊天小小程序1.李四端端#inclludee#inclludee#inclludee#inclludee#inclludee#inclludee#inclludee#inclludee/*李四端端*/*

8、作者:葉建敏敏*/*QQ:230081777422*/int mmainn() int i,rrfd,wfdd,leen=00,fdd_inn; charr sttr1128; int flaag,sstdiinfllag; fd_sset wriite_fd,reaad_ffd; struuct timmevaal nnet_timmer; mkfiifo(fiifo11,SS_IWWUSRR|S_IRUUSR|S_IIRGRRP|SS_IRROTHH); mkfiifo(fiifo22,SS_IWWUSRR|S_IRUUSR|S_IIRGRRP|SS_IRROTHH); rfd=opeen

9、(fiffo1,O_RDOONLYY); wfd=opeen(fiffo2,O_WROONLYY); if(rrfd=0 | wfdd=00) rretuurn 0; prinntf(這是是李四端!n); whille(11) FD_ZERRO(&reaad_ffd); FD_SETT(rffd,&reaad_ffd); FD_SETT(fiilenno(sstdiin),&reead_fd); nett_tiimerr.tvv_seec=55; nett_tiimerr.tvv_ussec=0; memmsett(sttr,00,siizeoof(sstr); if(i=sseleect(r

10、fdd+1,&reead_fd,NULLL,NNULLL,&nnet_timmer)=00) cconttinuue; if(FD_ISSSET(rfdd,&rreadd_fdd) reead(rfdd,sttr,ssizeeof(strr); prrinttf(-n); prrinttf(張三:%snn,sstr); if(FD_ISSSET(fillenoo(sttdinn),&reaad_ffd) prrinttf(-n); fggetss(sttr,ssizeeof(strr),sstdiin); leen=wwritte(wwfd,strr,sttrleen(sstr); closs

11、e(rrfd); closse(wwfd);2張三端端#inclludee #inclludee #inclludee #inclludee #inclludee #inclludee #inclludee /*張三端端*/*作者:葉建敏敏*/*QQ:230081777422*/int mmainn()int ii,rffd,wwfd,lenn=0,fd_in;char strr2556;int fflagg,sttdinnflaag;fd_seet wwritte_ffd,rreadd_fdd;strucct ttimeevall neet_ttimeer;mkfiffo(fiffo1,S_

12、IWUUSR|S_IIRUSSR|SS_IRRGRPP|S_IROOTH);mkfiffo(fiffo2,S_IWUUSR|S_IIRUSSR|SS_IRRGRPP|S_IROOTH);wfd=oopenn(ffifoo1,O_WWRONNLY);rfd=oopenn(ffifoo2,O_RRDONNLY);if(wffd=0|rfdd=00)reeturrn 00;printtf(這是張張三端!n);whilee(1)FD_ZEERO(&reead_fd);FD_SEET(rrfd,&reead_fd);FD_SEET(ffileeno(stddin),&rreadd_fdd);net_ttimeer.ttv_ssec=5;net_ttimeer.ttv_uusecc=0;memseet(sstr,0,ssizeeof(strr);if(i=sellectt(rffd+11,&rreadd_fdd,NUULL,NULLL,&nett_tiimerr)=0)contiinuee;if(FDD_ISSSETT(rffd,&reaad_ffd)read(rfdd,sttr,ssize

溫馨提示

  • 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

提交評論