程序間通訊 有名管道

2021-07-11 12:18:10 字數 1535 閱讀 6418

無名管道,由於沒有名字,只能用於親緣關係的程序間通訊.。為了克服這個缺點,提出了有名管道(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 無名管道 管道是半雙工的,資料只能向乙個方向流動 需要雙方通訊時,需要...