版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Linux進(jìn)程間通信(三)-管道通信之有名管道及其基礎(chǔ)實(shí)驗(yàn)分類:Linux應(yīng)用編程2013-06-11 15:44 1780人閱讀 評論(4)收藏 舉報(bào)有名管道accessmkfifo有名管道(FIFO)首先將上一節(jié)的有關(guān)有名管道的定義再貼出來有名管道是對無名管道的一種改進(jìn),它具有以下特點(diǎn):它可以使互不相關(guān)的兩個(gè)進(jìn)程間實(shí)現(xiàn)彼此通信;該管道可以通過路徑名來指出,并且在文件系統(tǒng)中是可見的。在建立了管道之后, 兩個(gè)進(jìn)程就可以把它當(dāng)做普通文件一樣進(jìn)行讀寫操作,使用非常方便;FIFO嚴(yán)格地遵循先進(jìn)先出規(guī)則,對管道及FIFO的讀總是從開始處返回?cái)?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在這里與普通文件不同的是阻塞問題。由于普通文件在 讀寫時(shí)不會(huì)出現(xiàn)阻塞問題,而在管道的讀寫中卻有阻塞的可能,這里的非阻塞標(biāo)志可以在 open()函數(shù)中設(shè)定為O_NONBLOCK
3、。下面分別對阻塞打開和非阻塞打開的讀寫進(jìn)行討論。對于讀進(jìn)程:若該管道是阻塞打開,且當(dāng)前FIFO內(nèi)沒有數(shù)據(jù),則對讀進(jìn)程而言將一直阻塞到有 數(shù)據(jù)寫入。若該管道是非阻塞打開,則不論FIFO內(nèi)是否有數(shù)據(jù),讀進(jìn)程都會(huì)立即執(zhí)行讀操作。 即如果FIFO內(nèi)沒有數(shù)據(jù),則讀函數(shù)將立刻返回0。對于寫進(jìn)程:若該管道是阻塞打開,則寫操作將一直阻塞到數(shù)據(jù)可以被寫入。若該管道是非阻塞打開而不能寫入全部數(shù)據(jù),則讀操作進(jìn)行部分寫入或者調(diào)用失 敗。下表列出了 mkfifo()函數(shù)的語法要點(diǎn)所所頭文件#inc lude #inc lude函數(shù)原型intmkfifo(cons( char *filenaTnejinode-t mod
4、e)函數(shù)簽數(shù)filenanie:要?jiǎng)?chuàng)建的管道,包含路徑modeO_RDONLY:讀管道O_WRONLY:寫管道O_RDWR:讀寫管道O_NONBLOCK:非阻塞CLCREAT:如果該文件不存在,那么就創(chuàng)建一個(gè)新的文件,并用第3個(gè)參數(shù) 為其設(shè)置權(quán)限O_EXCL:如果使用0.GREAT時(shí)文件存在,那么可返回錯(cuò)誤消息。這個(gè)簽 數(shù)可測試文件是杏存在函數(shù)返回值成功:0 出錯(cuò):-1表1 mkfifoO函數(shù)為了方便咱們查錯(cuò),再對FIFO相關(guān)的出錯(cuò)信息進(jì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)的出常信息卜面的實(shí)驗(yàn)中還要用到access()函數(shù),它的說明如下表:所需頭文件#include函數(shù)原型int access(constchar*filepaihJ int mode)函數(shù)參數(shù)fil即丑山:要檢查的文件或文件實(shí)的路徑,當(dāng)前目錄且接使用文件或文件夾名modeR_OK:只判斷是否有讀權(quán)限W_OK:只判斷是否有寫權(quán)限X_OK:判斷
6、是否有執(zhí)行權(quán)限F_OK:只判斷是杏存在函數(shù)返回值指的存取方式有效:0 出錯(cuò):表3 access ()函數(shù)access()函數(shù)的功能是確定文件或文件夾的訪問權(quán)限,即檢查某個(gè)文件的存取方式,比如 說是只讀方式、只寫方式等,如果指定的存取方式有效,則函數(shù)返回0,否則函數(shù)返回-1。基礎(chǔ)實(shí)驗(yàn)本實(shí)驗(yàn)包括兩個(gè)程序:fifo_read.c點(diǎn)此下載和fifo_write.c點(diǎn)此下載。一個(gè)用于讀管道, 另一個(gè)用于寫管道。其中在讀管道的程序中創(chuàng)建管道,并且作為main()函數(shù)里的參數(shù)由用 戶輸入要寫入的內(nèi)容;讀管道的程序會(huì)讀出用戶寫入到管道的內(nèi)容。這兩個(gè)程序采用的是阻 塞式讀寫管道模式。寫管道的程序如下:/* 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*/編寫保存上述兩個(gè)文件后分別使用命令:gcc fifo_write.c -
10、o fifo_write和命令:gccfifo_read.c -o fifo_read編譯。 為了能更好的觀察運(yùn)行效果,需要把這兩個(gè)程序分別在終 端里運(yùn)行,在這里首先啟動(dòng)讀管道程序。讀管道進(jìn)程在建立管道后就開始循環(huán)地從管道里讀 出內(nèi)容,如果沒有數(shù)據(jù)可讀,則一直阻塞到寫管道進(jìn)程向管道寫入數(shù)據(jù)。在啟動(dòng)了寫管道程 序后,讀進(jìn)程能夠從管道里讀出用戶的輸入內(nèi)容,程序運(yùn)行結(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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030消費(fèi)級3D打印設(shè)備家庭普及率影響因素與渠道變革
- 2025-2030消毒劑生產(chǎn)質(zhì)量影響因素測試實(shí)驗(yàn)室驗(yàn)證方案
- 軟件項(xiàng)目開發(fā)質(zhì)量保證方案
- 現(xiàn)代商業(yè)銀行客戶服務(wù)流程優(yōu)化方案
- 醫(yī)療救援隊(duì)管理方案及職責(zé)說明
- 企業(yè)經(jīng)理層任期制實(shí)施方案
- 建筑吸音吊頂材料選型與施工方案
- 電梯安全防護(hù)施工方案及風(fēng)險(xiǎn)評估報(bào)告
- 2026全國工商聯(lián)直屬單位面向社會(huì)招聘1人備考題庫及1套參考答案詳解
- 2026廣東中山市民眾街道村(社區(qū))招聘8人備考題庫及答案詳解參考
- 2025年江蘇省公務(wù)員面試模擬題及答案
- 2024-2025學(xué)年山東省濟(jì)南市槐蔭區(qū)七年級(上)期末地理試卷
- 2025中國家庭品牌消費(fèi)趨勢報(bào)告-OTC藥品篇-
- 機(jī)器人學(xué):機(jī)構(gòu)、運(yùn)動(dòng)學(xué)及動(dòng)力學(xué) 課件全套 第1-8章 緒論-機(jī)器人綜合設(shè)計(jì)
- JJG 694-2025原子吸收分光光度計(jì)檢定規(guī)程
- 廣東省2025屆湛江市高三下學(xué)期第一次模擬考試-政治試題(含答案)
- 2025年3月29日全國事業(yè)單位事業(yè)編聯(lián)考A類《職測》真題及答案
- 梯子使用安全操作規(guī)程
- 民航保健與衛(wèi)生
- 醫(yī)藥ka專員培訓(xùn)課件
- 【中考真題】2025年上海英語試卷(含聽力mp3)
評論
0/150
提交評論