|  | |||||||||||||||||||||||||||||||||||
| 有名管道(FIFO) | |||||||||||||||||||||||||||||||||||
| 本文關鍵字: linux 管道通信,linux 進程通信方式,有名管道,FIFO 有(you)名管(guan)道的(de)(de)(de)(de)創建可以(yi)使用函(han)數mkfifo(),該函(han)數類(lei)似于文件(jian)中的(de)(de)(de)(de)open()操作(zuo),可以(yi)指定管(guan)道的(de)(de)(de)(de)路徑和打開的(de)(de)(de)(de)模式。用戶還(huan)可以(yi)在命令(ling)行使用“mknod 管(guan)道名 p”來創建有(you)名管(guan)道。 在創建管道(dao)成功后(hou),就可以使用open()、read()和write()這(zhe)些函數了。與(yu)普(pu)通文件的(de)開(kai)(kai)發設置(zhi)一(yi)樣,對(dui)于為讀而打開(kai)(kai)的(de)管道(dao)可在open()中(zhong)(zhong)設置(zhi)O_RDONLY,對(dui)于為寫而打開(kai)(kai)的(de)管道(dao)可在open()中(zhong)(zhong)設置(zhi)O_WRONLY,在這(zhe)里(li)與(yu)普(pu)通文件不同的(de)是阻(zu)(zu)(zu)(zu)塞問題。由于普(pu)通文件在讀寫時不會出現阻(zu)(zu)(zu)(zu)塞問題,而在管道(dao)的(de)讀寫中(zhong)(zhong)卻(que)有阻(zu)(zu)(zu)(zu)塞的(de)可能,這(zhe)里(li)的(de)非(fei)阻(zu)(zu)(zu)(zu)塞標志可以在open()函數中(zhong)(zhong)設定為O_NONBLOCK。下面分(fen)別對(dui)阻(zu)(zu)(zu)(zu)塞打開(kai)(kai)和非(fei)阻(zu)(zu)(zu)(zu)塞打開(kai)(kai)的(de)讀寫進行討論(lun)。   對于(yu)讀(du)進(jin)程(cheng): ● 若(ruo)該管道是阻塞打開,且當前(qian)FIFO內(nei)沒有(you)(you)數(shu)據,則對讀進(jin)程而言將(jiang)一直阻塞到有(you)(you)數(shu)據寫(xie)入。 ● 若該管道(dao)是(shi)非阻(zu)塞打開,則不論(lun)FIFO內(nei)是(shi)否(fou)有數(shu)(shu)據,讀(du)進程(cheng)都會立(li)(li)即執行讀(du)操作。即如(ru)果FIFO內(nei)沒有數(shu)(shu)據,則讀(du)函數(shu)(shu)將立(li)(li)刻返回0。 對于寫進程:   ● 若(ruo)該管道(dao)是阻塞(sai)打(da)開,則寫(xie)操(cao)作將一直阻塞(sai)到數(shu)據可以被寫(xie)入。 ● 若(ruo)該管道是非(fei)阻(zu)塞(sai)打開(kai)而不能寫(xie)入(ru)全部數(shu)據,則讀(du)操作進行部分寫(xie)入(ru)或(huo)者調用失敗(bai)。 表1列出了mkfifo()函數的語法要點。 表(biao)1 mkfifo()函數語法(fa)要點(dian) 
   表2再對FIFO相關的出錯(cuo)信息進行歸納,以方便(bian)用戶查錯(cuo)。 表(biao)2 FIFO相關的出錯信息 
 下(xia)面的(de)實(shi)例(li)包(bao)含兩(liang)個(ge)程(cheng)(cheng)序(xu),一個(ge)用(yong)于讀(du)管(guan)(guan)道(dao),另一個(ge)用(yong)于寫管(guan)(guan)道(dao)。其(qi)中(zhong)在讀(du)管(guan)(guan)道(dao)的(de)程(cheng)(cheng)序(xu)中(zhong)創建管(guan)(guan)道(dao),并且作(zuo)為(wei)main()函數里(li)的(de)參數由用(yong)戶輸入(ru)要寫入(ru)的(de)內(nei)容;讀(du)管(guan)(guan)道(dao)的(de)程(cheng)(cheng)序(xu)會讀(du)出用(yong)戶寫入(ru)到管(guan)(guan)道(dao)的(de)內(nei)容。這兩(liang)個(ge)程(cheng)(cheng)序(xu)采用(yong)的(de)是阻塞式讀(du)寫管(guan)(guan)道(dao)模式。 寫管道的程序如(ru)下(xia):     /* fifo_write.c */ 讀管道(dao)程序如(ru)下:     /* fifo_read.c */ 為了能夠較好地觀(guan)察運(yun)行(xing)結(jie)果(guo)(guo),需要把這兩個(ge)程序(xu)分別在兩個(ge)終端里運(yun)行(xing),在這里首先(xian)啟動讀管(guan)(guan)(guan)道(dao)(dao)(dao)程序(xu)。讀管(guan)(guan)(guan)道(dao)(dao)(dao)進(jin)程在建立管(guan)(guan)(guan)道(dao)(dao)(dao)后就開始循環地從管(guan)(guan)(guan)道(dao)(dao)(dao)里讀出內容,如(ru)(ru)果(guo)(guo)沒有數據可(ke)讀,則一直阻塞(sai)到(dao)寫(xie)管(guan)(guan)(guan)道(dao)(dao)(dao)進(jin)程向管(guan)(guan)(guan)道(dao)(dao)(dao)寫(xie)入數據。在啟動了寫(xie)管(guan)(guan)(guan)道(dao)(dao)(dao)程序(xu)后,讀進(jin)程能夠從管(guan)(guan)(guan)道(dao)(dao)(dao)里讀出用(yong)戶(hu)的輸(shu)入內容,程序(xu)運(yun)行(xing)結(jie)果(guo)(guo)如(ru)(ru)下。 終端一:     $ ./fifo_read 終端二(er):     $ ./fifo_write FIFO 本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》 熱點鏈(lian)接:  
         1、標準流管道 | |||||||||||||||||||||||||||||||||||