Linux 程序間通訊之管道

2021-08-19 08:06:05 字數 2644 閱讀 7411

這裡說的管道是指匿名管道(無名管道),是 unix 系統ipc最古老的形式。

其本質是乙個偽檔案(實為核心緩衝區)。

它是半雙工的(即資料只能在乙個方向上流動),具有固定的讀端和寫端。

它只能用於具有親緣關係的程序之間的通訊(也是父子程序或者兄弟程序之間)。

它可以看成是一種特殊的檔案,對於它的讀寫也可以使用普通的read、write 等函式。但是它不是普通的檔案,並不屬於其他任何檔案系統,並且只存在於記憶體中。

資料一旦被讀走,便不在管道中存在,不可反覆讀取。

管道的大小有限制,當要寫⼊的資料量⼤於pipe_buf時,linux將不再保證寫⼊入的原⼦子性。

一般而言,核心會對管道操作進行同步與互斥。

一般而言,程序退出,管道釋放,所以管道的生命週期隨程序。

int pipe(int fd[2]);   

// 標頭檔案:#include

// 引數fd:檔案描述符陣列,其中fd[0]表示讀端, fd[1]表示寫端

// 返回值:若成功返回0,失敗返回-1

把子程序ls -l命令的結果放入管道中,父程序從管道中讀取這些資訊,用wc -l命令計算檔案個數。

}當沒有資料可讀時

o_nonblock disableread呼叫阻塞,即程序暫停執行,一直等到有資料來到為止。

o_nonblock enableread呼叫返回-1,errno值為eagain

當管道滿的時候

o_nonblock disable: write呼叫阻塞,直到有程序讀走資料。

o_nonblock enable:呼叫返回-1,errno值為eagain

如果所有管道寫端對應的檔案描述符被關閉,則read返回0。

如果所有管道讀端對應的檔案描述符被關閉,則write操作會產⽣生信sigpipe,進而可能導致write程序退出。

當要寫入的資料量不大於pipe_buf時,linux將保證寫入的原⼦子性。

當要寫入的資料量大於pipe_buf時,linux將不再保證寫入的原子性。

管道的應用有乙個限制是只能在具有共同祖先(具有親緣關係)的程序間通訊。如果我們想在不相關的程序之間交換資料,可以使用fifo檔案來做這項工作,它經常被稱為命名管道。

命名管道有路徑名與之相關聯,它以一種特殊裝置檔案形式存在於檔案系統中。

匿名管道由pipe函式建立並開啟。命名管道由mkfifo函式建立,開啟用open。

fifo(命名管道)與pipe(匿名管道)之間唯一的區別在它們建立與開啟的方式不同,一但這些工作完成之後,它們具有相同的語義。

int mkfifo(const

char *pathname, mode_t mode);

// 標頭檔案:#include

// 返回值:成功返回0,出錯返回-1

// 引數1:mkfifo() 會依引數pathname建立特殊的fifo檔案,該檔案必須不存

// 引數2:mode 表示建立出來的fifo檔案的許可權。

fifo的通訊方式類似於在程序中使用檔案來傳輸資料,只不過fifo型別檔案同時具有管道的特性。在資料讀出時,fifo管道中同時清除資料,並且「先進先出」。下面的例子演示了使用 fifo 進行 ipc 的過程:

< code mkfifo_w.c>

#include 

#include

#include

#include

#include

#include

int main()

sleep(1); // 休眠1秒

}close(fd); // 關閉fifo檔案

return

0;}

< code mkfifo_r.c >

#include

#include

#include

#include

#include

int main()

while((len = read(fd, buff, 1024)) > 0) // 讀取fifo管道

close(fd); // 關閉fifo檔案

return

0;}

linux程序間通訊之管道通訊

一 命名管道通訊 管道通訊分為 無名管道和有名管道 無名管道是用於父子孫程序,之間有血緣關係 有名管道 用於任意兩個程序 無名管道 1 建立 int pipe int filedis 2 它會建立兩個檔案描述符 filedis 0 用於讀管道 filedis 1 用於寫管道 通常先建立乙個管道,再通...

linux程序間通訊之管道

下面幾節,將分別溫習下linux程序進通訊的幾種機制1 管道 管道是比較古老的程序間的通訊方式。主要有有名管道和無名管道兩種。2 無名管道 它的特點就是 1 只能使用在具有親緣關係的程序之間的通訊 父子程序或者兄弟程序之間 因為只有具有親緣關係的程序才能繼承其建立的檔案描述符。2 是乙個半雙工的通訊...

Linux程序間通訊之管道

管道,你可以把它想成一根資料線,連線了兩個程序,使他們可以互相通訊。更嚴謹來說,它是乙個檔案或者一塊共享區,乙個程序往裡面寫資料,另乙個程序從裡面拿資料,以此種方式完成程序間通訊。管道是unix系統ipc最古老的形式,所有的unix系統都提供此種通訊機制 unix系統ipc是各種程序通訊方式的統稱 ...