這裡說的管道是指匿名管道(無名管道),是 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 disable
:read
呼叫阻塞,即程序暫停執行,一直等到有資料來到為止。
o_nonblock enable
:read
呼叫返回-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是各種程序通訊方式的統稱 ...