歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux進程間通信(三) 管道通信之有名管道及其基礎實驗

Linux進程間通信(三) 管道通信之有名管道及其基礎實驗

日期:2017/3/3 16:21:30   编辑:關於Linux

有名管道(FIFO)

首先將上一節的有關有名管道的定義再貼出來

有名管道是對無名管道的一 種改進,它具有以下特點:

① 它可以使互不相關的兩個進程間實現彼此通信;

② 該管道可以通過路徑名來指出,並且在文件系統中是可見的。在建立了管道之後,兩個進程就可以把它 當做普通文件一樣進行讀寫操作,使用非常方便;

③ FIFO嚴格地遵循先進先出規則,對管道及 FIFO的讀總是從開始處返回數據,對它們的寫則是把數據添加到末尾,它們不支持如 lseek()等文件定位操作 。

有名管道的創建可以使用函數 mkfifo(),該函數類似與文件中的 open()操作,可以指定管道的路 徑和打開的模式。咱們還可以在命令行使用“mknod 管道名 p”來創建有名管道。

在管道創建成功後 ,就可以使用open()、write()和read()這些函數了。與普通文件的開發設置一樣,對於為讀而打開的管道可 在open()中設置O_RDONLY,對於為寫而打開的管道可在open()中設置O_WRONLY,在這裡與普通文件不同的是阻塞 問題。由於普通文件在讀寫時不會出現阻塞問題,而在管道的讀寫中卻有阻塞的可能,這裡的非阻塞標志可以 在open()函數中設定為O_NONBLOCK。下面分別對阻塞打開和非阻塞打開的讀寫進行討論。

對於讀進程 :

若該管道是阻塞打開,且當前FIFO內沒有數據,則對讀進程而言將一直阻塞到有數據寫入 。

若該管道是非阻塞打開,則不論FIFO內是否有數據,讀進程都會立即執行讀操作。即如果 FIFO內沒有數據,則讀函數將立刻返回0。

對於寫進程:

若該管道是阻塞打開,則寫 操作將一直阻塞到數據可以被寫入。

若該管道是非阻塞打開而不能寫入全部數據,則讀操作 進行部分寫入或者調用失敗。

下表列出了mkfifo()函數的語法要點

為了方便咱們查錯,再對FIFO相關的出錯信息進行歸納,如下表:

下面的實驗中還要用到 access()函數,它的說明如下表:

access()函數的功能是確定文 件或文件夾的訪問權限,即檢查某個文件的存取方式,比如說是只讀方式、只寫方式等,如果指定的存取方式 有效,則函數返回0,否則函數返回-1。

基礎實驗

本實驗包括兩個程序:fifo_read.c:

http://download.csdn.net/detail/mybelief321/5563223

和fifo_write.c:

http://download.csdn.net/detail/mybelief321/5563213

一個用於讀管道,另一個用於寫管道。其中在讀管道的程序中創建管道,並且作為main()函數裡的參數由 用戶輸入要寫入的內容;讀管道的程序會讀出用戶寫入到管道的內容。這兩個程序采用的是阻塞式讀寫管道模 式。

寫管道的程序如下:

讀管道程序如下

編寫保存上述兩個文件後分別使用命令:gcc fifo_write.c -o fifo_write和命令:gcc fifo_read.c -o fifo_read編譯。

為了能更好的觀察運行效果,需要把這兩個程序分別在終端裡運行,在這裡首先啟 動讀管道程序。讀管道進程在建立管道後就開始循環地從管道裡讀出內容,如果沒有數據可讀,則一直阻塞到 寫管道進程向管道寫入數據。在啟動了寫管道程序後,讀進程能夠從管道裡讀出用戶的輸入內容,程序運行結 果如下:

Copyright © Linux教程網 All Rights Reserved