




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、Linux進程間通信(三)-管道通信之有名管道及其基礎(chǔ)實驗分類:Linux應(yīng)用編程2013-06-11 15:44 1780人閱讀 評論(4)收藏 舉報有名管道accessmkfifo有名管道(FIFO)首先將上一節(jié)的有關(guān)有名管道的定義再貼出來有名管道是對無名管道的一種改進,它具有以下特點:它可以使互不相關(guān)的兩個進程間實現(xiàn)彼此通信;該管道可以通過路徑名來指出,并且在文件系統(tǒng)中是可見的。在建立了管道之后, 兩個進程就可以把它當(dāng)做普通文件一樣進行讀寫操作,使用非常方便;FIFO嚴(yán)格地遵循先進先出規(guī)則,對管道及FIFO的讀總是從開始處返回數(shù)據(jù),對 它們的寫則是把數(shù)據(jù)添加到末尾,它們不支持如lseek
2、()等文件定位操作。有名管道的創(chuàng)建可以使用函數(shù)mkfifo(),該函數(shù)類似與文件中的open()操作,可以指 定管道的路徑和打開的模式。咱們還可以在命令行使用“mknod管道名p”來創(chuàng)建有名管 道。在管道創(chuàng)建成功后,就可以使用open()、write()和read()這些函數(shù)了。與普通文件的 開發(fā)設(shè)置一樣,對于為讀而打開的管道可在open()中設(shè)置O_RDONLY對于為寫而打開的管 道可在open()中設(shè)置O_WRONLY在這里與普通文件不同的是阻塞問題。由于普通文件在 讀寫時不會出現(xiàn)阻塞問題,而在管道的讀寫中卻有阻塞的可能,這里的非阻塞標(biāo)志可以在 open()函數(shù)中設(shè)定為O_NONBLOCK
3、。下面分別對阻塞打開和非阻塞打開的讀寫進行討論。對于讀進程:若該管道是阻塞打開,且當(dāng)前FIFO內(nèi)沒有數(shù)據(jù),則對讀進程而言將一直阻塞到有 數(shù)據(jù)寫入。若該管道是非阻塞打開,則不論FIFO內(nèi)是否有數(shù)據(jù),讀進程都會立即執(zhí)行讀操作。 即如果FIFO內(nèi)沒有數(shù)據(jù),則讀函數(shù)將立刻返回0。對于寫進程:若該管道是阻塞打開,則寫操作將一直阻塞到數(shù)據(jù)可以被寫入。若該管道是非阻塞打開而不能寫入全部數(shù)據(jù),則讀操作進行部分寫入或者調(diào)用失 敗。下表列出了 mkfifo()函數(shù)的語法要點所所頭文件#inc lude #inc lude函數(shù)原型intmkfifo(cons( char *filenaTnejinode-t mod
4、e)函數(shù)簽數(shù)filenanie:要創(chuàng)建的管道,包含路徑modeO_RDONLY:讀管道O_WRONLY:寫管道O_RDWR:讀寫管道O_NONBLOCK:非阻塞CLCREAT:如果該文件不存在,那么就創(chuàng)建一個新的文件,并用第3個參數(shù) 為其設(shè)置權(quán)限O_EXCL:如果使用0.GREAT時文件存在,那么可返回錯誤消息。這個簽 數(shù)可測試文件是杏存在函數(shù)返回值成功:0 出錯:-1表1 mkfifoO函數(shù)為了方便咱們查錯,再對FIFO相關(guān)的出錯信息進行歸納,如下表:EAGGESS參數(shù).filename所指定的目錄路徑無可執(zhí)行的杈限EEX1ST參數(shù)filename所指正的文件已存在ENAMETCK3LONG
5、參數(shù)filename的路徑名稱太長ENOENT參數(shù)filename包含的目錄不存在ENOSPC文件系統(tǒng)的剩余空間不足ENOTDIR參數(shù)filename路徑中的目錄存在但卻非真正的目錄EROFS簽數(shù)filename指定的文件存在于只諼文件系統(tǒng)內(nèi)表2 FIFO相關(guān)的出常信息卜面的實驗中還要用到access()函數(shù),它的說明如下表:所需頭文件#include函數(shù)原型int access(constchar*filepaihJ int mode)函數(shù)參數(shù)fil即丑山:要檢查的文件或文件實的路徑,當(dāng)前目錄且接使用文件或文件夾名modeR_OK:只判斷是否有讀權(quán)限W_OK:只判斷是否有寫權(quán)限X_OK:判斷
6、是否有執(zhí)行權(quán)限F_OK:只判斷是杏存在函數(shù)返回值指的存取方式有效:0 出錯:表3 access ()函數(shù)access()函數(shù)的功能是確定文件或文件夾的訪問權(quán)限,即檢查某個文件的存取方式,比如 說是只讀方式、只寫方式等,如果指定的存取方式有效,則函數(shù)返回0,否則函數(shù)返回-1?;A(chǔ)實驗本實驗包括兩個程序:fifo_read.c點此下載和fifo_write.c點此下載。一個用于讀管道, 另一個用于寫管道。其中在讀管道的程序中創(chuàng)建管道,并且作為main()函數(shù)里的參數(shù)由用 戶輸入要寫入的內(nèi)容;讀管道的程序會讀出用戶寫入到管道的內(nèi)容。這兩個程序采用的是阻 塞式讀寫管道模式。寫管道的程序如下:/* fi
7、fo_write.c#includlesys/types. h#includle#i.ncludlencl udef cnt:l. h#tnclude#includlestdio. h#includle#define MYFIFO /七叩川療討口 /*有名管道文件名如ID 尸在limits.h中有 define PIPE_BUF 4D96 即4不孚節(jié)大小丫11 define MAX_BUFFER_SIZE PIPE_BUF /*定義在limits12int main(int argc,char *argv) 尸參數(shù)為即將寫入的宇符串*/int fd;char buffMAX_BJFFER_SI
8、ZE;int nwrite;1819if(argc0) printf (Write 膈to FIFO nT ,buff);close(fd);exit(0);讀管道程序如下/ftfo_read.c 讀管道程序*7#includesys/types.htfincludesys/stat.h#includeSincludecfcntl.h#includecstringhM ncludetfincludecstdio.htfincludediniits. hIB #define MYFIFOif a1 /* 有名管道丈件名】,*在limits.h中有 #define PIPE_BUF 4096 即4
9、不學(xué)節(jié)大小=#define MAX_BUFFER_SIZE PIPE_BUF /*定義在limits.h4*/13int main()char buffMAX_BUFFER_SIZE;int fd;int nread;尸判斷有名管道是否已經(jīng)存在.若尚未創(chuàng)建,則以相應(yīng)的權(quán)限創(chuàng)建/if(access(MFIFO,F_OK)=-l) TOC o 1-5 h z if(nkfifo(MFIFO,D666)D)printffRead from FIFOnH,buff);)close(fd);exit(D);4748 )/*end*/編寫保存上述兩個文件后分別使用命令:gcc fifo_write.c -
10、o fifo_write和命令:gccfifo_read.c -o fifo_read編譯。 為了能更好的觀察運行效果,需要把這兩個程序分別在終 端里運行,在這里首先啟動讀管道程序。讀管道進程在建立管道后就開始循環(huán)地從管道里讀 出內(nèi)容,如果沒有數(shù)據(jù)可讀,則一直阻塞到寫管道進程向管道寫入數(shù)據(jù)。在啟動了寫管道程 序后,讀進程能夠從管道里讀出用戶的輸入內(nèi)容,程序運行結(jié)果如下:FIFOTestProgramOO songubuntu: /lJanxi songubuntu:/lianxi$ ,/fiforesd Redd FIFO from FIFO一Read Test from FIFO Read Program1 from FIFO。管 songpubuntu: /lianxisongubuntu:-/LianxiS /fifo_write Usage: ./fifowrite string songubuntu:/lianxi$ ,/fifo_write Write 1
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 賣書快遞合同范本
- 廣州課題申報書怎么寫
- 雙方簽訂獨家合同范本
- 各種合同范本里
- 調(diào)查現(xiàn)狀課題申報書
- 幼兒校級課題申報書范文
- 創(chuàng)鑫供貨合同范本
- 名酒酒廠供貨合同范本
- 化妝 攝影 服務(wù)合同范本
- 教研課題申報書
- XX大學(xué)學(xué)科競賽項目申請書
- 03S702鋼筋混凝土化糞池圖集
- 06-2018泥石流災(zāi)害防治工程勘查規(guī)范(試行)
- 黑鯛淡水養(yǎng)殖技術(shù)
- 焊工培訓(xùn)-焊接基礎(chǔ)知識-課件
- 剪映電腦版使用說明教程
- 社會學(xué)概論全套PPT完整教學(xué)課件
- 船體結(jié)構(gòu)與制圖
- 安全風(fēng)險分級管控和隱患排查治理雙重預(yù)防體系20230531
- 建筑工程質(zhì)量通病防治措施
- 生態(tài)系統(tǒng)模擬模型
評論
0/150
提交評論