無名管道,由於沒有名字,只能用於親緣關係的程序間通訊.。為了克服這個缺點,提出了有名管道(fifo)。
fifo不同於無名管道之處在於它提供了乙個路徑名與之關聯,以fifo的檔案形式存在於檔案系統中,這樣,即使與fifo的建立程序不存在親緣關係的程序,只要可以訪問該路徑,就能夠彼此通過fifo相互通訊,因此,通過fifo不相關的程序也能交換資料。值的注意的是,fifo嚴格遵循先進先出(first in firstout),對管道及fifo的讀總是從開始處返回資料,對它們的寫則把資料新增到末尾。它們不支援諸如lseek()等檔案定位操作。有名管道的名字存在於檔案系統中,內容存放在記憶體中。有名管道比無名管道多了乙個開啟操作:open
fifo的開啟規則:
如果當前開啟操作時為讀而開啟fifo時,若已經有相應程序為寫而開啟該fifo,則當前開啟操作將成功返回;否則,可能阻塞到有相應程序為寫而開啟該fifo(當前開啟操作設定了阻塞標誌);或者,成功返回(當前開啟操作沒有設定阻塞標誌)。
如果當前開啟操作時為寫而開啟fifo時,如果已經有相應程序為讀而開啟該fifo,則當前開啟操作將成功返回;否則,可能阻塞直到有相應程序為讀而開啟該fifo(當前開啟操作設定了阻塞標誌);或者,返回enio錯誤(當期開啟操作沒有設定阻塞標誌)。
1、 實驗步驟演示
(1):首先在乙個終端中編譯寫端然後執行。
可見程序無法繼續執行下去,此時開啟另乙個終端,編譯讀過程並執行,顯示如下:
而且在讀終端執行顯示結果的同時,執行寫程序的終端顯示也發生了變化。可見讀寫程序需要同時進行才可以完成有名管道的通訊。
寫端**:
#include#include#include#include#include#include#include#include#define fifo_name "/home/owen/myfifo/my_fifo"
//int main(int argc,char *argv)
}printf("process %d opening fifo o_wronly\n",getpid());
pipe_fd=open(fifo_name,o_wronly);
printf("the file`s descriptor is %d\n",pipe_fd);
if(pipe_fd!=-1)
else
exit(1);
printf("process %d finished\n",getpid());
exit(1);
}讀端**:
#include#include#include#include#include#include#include#include#define fifo_name "/home/owen/myfifo/my_fifo"
int main(int argc,char *argv)
else
exit(1);
printf("process %d finished,%d bytes read\n",getpid(),bytes_read);
exit(1);
}
程序間通訊 有名管道
mkfifo test 這條命令建立了乙個名字為 test 的命名管道。接下來我們用乙個程序向這個管道裡面寫資料,然後有另外乙個程序把裡面的資料讀出來。echo this is a pipe test 寫資料 這個時候管道的內容沒有被讀出的話,那麼這個命令就會一直停在這裡,只有當另外乙個程序把 te...
程序間通訊 管道(有名管道)
前幾天我們簡單的介紹了程序間通訊的一種渠道 管道,我們有說道管道的概念,管道的通訊原理,還提到了管道的兩種型別 有名管道和無名管道,今天我們就來說說有名管道吧 基本概念 有名管道在檔案目錄中有乙個檔案標示 管道檔案 實際不佔據磁碟空間。資料快取在記憶體上 只有使用時記憶體才開闢,由於在記憶體上,因此...
程序間通訊 有名管道 無名管道
顧名思義,管道就像是將資料放入到乙個長長的管子中一樣,肯定會有一端寫入資料,稱為寫端,有一段讀出資料,稱為讀端。既然是說像管子一樣那麼它肯定有大小吧,資源不是無窮無盡的,預設下管道的大小是64k,用ulimit a 可以檢視。1 無名管道 管道是半雙工的,資料只能向乙個方向流動 需要雙方通訊時,需要...