程序間通訊(管道和有名管道)

2022-07-15 19:03:10 字數 1870 閱讀 5327

管道(pipe)是兩個程序之間進行單向通訊的機制,因為它的單向性,所以又稱為半雙工管道。它主要用於程序間的一些簡單通訊。

資料只能由乙個程序流向另乙個程序(乙個寫管道,乙個讀管道);如果要進行全雙工通訊,需要建立兩個管道。

管道只能用於父子程序或者兄弟程序之間的通訊。

管道沒有名字,且其緩衝區大小有限。

乙個程序向管道寫資料,資料每次都新增在管道緩衝區的末尾;另乙個程序從管道另一端讀資料,從緩衝區頭部讀出資料。

建立管道的命令:

#include int pipe(int fd[2])

管道兩端分別用描述符fd[0]和fd[1]來描述。其中fd[0]只能用於讀,稱為管道讀端;fd[1]只能用於寫,稱為管道寫端。

管道的一般用法:先建立乙個管道,之後用fork建立乙個子程序,之後父程序關閉管道的讀端(或寫端),子程序關閉管道的寫端(或讀端),父程序向管道寫輸入,子程序就能從管道讀資料了。

例子:

#include #include 

#include

#include

#include

/*讀管道

*/void read_from_pipe (int

fd)

/*寫管道

*/void write_to_pipe (int

fd)

int main(void)

pid =fork();

switch

(pid)

return0;

}

有名管道

管道的乙個不足之處是沒有名字,因此只能在具有親緣關係的程序之間通訊。而「有名管道」與此不同,它提供了乙個路徑名與之關聯,作為乙個裝置檔案存在,即使無親緣關係的程序之間,只要能訪問該路徑,也可以通過fifo進行通訊。fifo總是按照先進先出的原則工作,第乙個被寫入的資料將首先從管道中讀出。

函式原型:

#include #include 

int mkfifo(const

char *path,mode_t mode);

path為建立有名管道的路徑名;mode為建立有名管道的模式,指明其訪問許可權。函式呼叫成功返回0,失敗返回-1。

使用乙個存在的有名管道之前,需要用open()將其開啟。因為有名管道是乙個存在於硬碟上的檔案,而管道是存在於記憶體中的特殊檔案。

以下程式演示有名管道在無親緣關係的程序之間如何通訊。

寫端:

#include #include 

#include

#include

#include

#include

#define fifo_name "myfifo"

#define buf_size 1024

int main(void)

if((fd = open (fifo_name, o_wronly) ) == -1)/*

以寫方式開啟fifo

*/ write (fd, buf, strlen(buf)+1); /*

向fifo寫資料

*/close (fd);

exit (0);

}

讀端:

#include #include 

#include

#include

#include

#include

#define fifo_name "myfifo"

#define buf_size 1024

int main(void

)

以上就是管道和有名管道的基本用法了。

程序間通訊 管道(有名管道)

前幾天我們簡單的介紹了程序間通訊的一種渠道 管道,我們有說道管道的概念,管道的通訊原理,還提到了管道的兩種型別 有名管道和無名管道,今天我們就來說說有名管道吧 基本概念 有名管道在檔案目錄中有乙個檔案標示 管道檔案 實際不佔據磁碟空間。資料快取在記憶體上 只有使用時記憶體才開闢,由於在記憶體上,因此...

Linux程序間通訊 管道(有名管道

時隔很久,再來更博.今天主要寫的是linux中程序間通訊,程序間進行通訊的目的就是多個程序之間資料互相交換。程序間通訊方式有以下幾種 1 訊號 2 管道 分為有名管道和無名管道 3 訊號量 4 訊息佇列 5 共享儲存 共享記憶體 6 套接字 socket 其中套接字屬於多機通訊 全雙工通訊 其餘的屬...

Linux 程序間通訊(管道及有名管道FIFO)

一.管道 1.只能用於具有親緣關係的程序之間的通訊 2.半雙工通訊模式 3.一種特殊的檔案,是一種只存在於核心中的讀寫函式 管道基於檔案描述符,管道建立時,有兩個檔案描述符 a.fd 0 固定用於讀管道 b.fd 1 固定用於寫管道 建立管道 pipe 一般步驟 1.pipe 建立管道 2.fork...