版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024生豬買賣合同協(xié)議書范本
- 個人勞動合同(2024版)4篇
- 2025年度新能源產(chǎn)業(yè)借款合同綠色能源發(fā)展支持3篇
- 2025年度二手房買賣居間服務(wù)與鄰里關(guān)系協(xié)調(diào)合同正本4篇
- 2025年度新能源車輛采購代理合同終止協(xié)議范本3篇
- 2025年油氣儲罐安全監(jiān)控系統(tǒng)銷售合同范本4篇
- 2025年高校食堂食品安全與營養(yǎng)餐配送服務(wù)協(xié)議3篇
- 文化視角下的兒童交通行為分析與引導(dǎo)策略研究
- 2025版農(nóng)戶小麥種植保險及購銷保障合同2篇
- 2025版互聯(lián)網(wǎng)廣告內(nèi)容審核與發(fā)布協(xié)議3篇
- 2024-2030年中國海泡石產(chǎn)業(yè)運行形勢及投資規(guī)模研究報告
- 動物醫(yī)學(xué)類專業(yè)生涯發(fā)展展示
- 2024年同等學(xué)力申碩英語考試真題
- 消除“艾梅乙”醫(yī)療歧視-從我做起
- 非遺文化走進(jìn)數(shù)字展廳+大數(shù)據(jù)與互聯(lián)網(wǎng)系創(chuàng)業(yè)計劃書
- 科普知識進(jìn)社區(qū)活動總結(jié)與反思
- 現(xiàn)金日記賬模板(帶公式)
- 消化內(nèi)科??票O(jiān)測指標(biāo)匯總分析
- 混凝土結(jié)構(gòu)工程施工質(zhì)量驗收規(guī)范
- 肝性腦病患者的護(hù)理措施課件
- 大跨度斜拉橋上部結(jié)構(gòu)施工技術(shù)(圖文并茂)
評論
0/150
提交評論