程序間通訊(1) 管道pipe

2021-08-17 01:39:03 字數 2552 閱讀 9796

學習linux的知識中,有乙個特別重要的概念叫「程序」,而要進行程序間通訊時,有乙個特別重要的概念就是--管道,今天,我們就來學習一下什麼是管道,它能又幹什麼呢?

一、概念

管道:把乙個程序連線到另外乙個程序的乙個資料流稱為管道。

(其實,我們聯絡現實生活,自來水管可以將我們使用者和供水站連線起來,通過管道運輸水流,在這裡可以借助這個例子              幫助我們理解程序間通訊中管道的概念)

二、匿名管道

1.原型:

int pipe(int fd[2]);

//fd為檔案描述符,其中fd[0]表示讀端,fd[1]表示寫端

2.下面,我們來實現一段從鍵盤讀取資料,寫入管道,讀取管道,寫到螢幕的**

#include#include#include#includeint main(void)

memset(buf, 0x00, sizeof(buf));

//讀取管道

if ((len = read(fds[0], buf, 100)) == -1)

//寫到螢幕

if (write(1, buf, len) != len)

}}

3.通過父程序fork出子程序通過管道連線的過程如下:

(1)父程序建立管道

(2)父程序fork出子程序(左邊父程序,右邊子程序)

(3)父程序關閉fd[0],子程序關閉fd[1]

管道的讀寫操作是相對應的,當父程序fork出子程序時,兩邊對同時開啟讀寫端,這樣會導致程式不知道到底在管道哪一端讀資料,哪一端寫資料。因此,我們必須關閉關閉父程序的一端和子程序對應的另外一端,這樣才能進行正常的讀寫操作。

說明:管道具有原子性,當寫入管道的資料不大於pipe_buf時,linux將保證寫入資料的原子性;當寫入管道的資料大於pipe_buf時,linux將不保正寫入資料的原子性。

4.匿名管道的特點

(1)只能用於具有共同祖先的程序(有親緣關係)之間進行通訊。通常,乙個管道由乙個程序建立,然年該程序呼叫fork,之後          父子程序就可以用該管道進行通訊;

(2)管道提供流式服務;

(3)管道的生命週期隨程序(一般而言,程序退出,管道釋放);

(4)一般而言,核心會對管道進行同步和互斥;

(5)管道是半雙工的,資料只能由乙個方向流動;雙方通訊時,需要建立兩個管道。

這裡可能會有一些比較陌生的詞語,我們來解釋一下:

(1)把兩個程序看到的公共資源叫做臨界資源,這兩個程序的**叫做臨界區;

(2)管道在訪問臨界資源時,既要保證互斥,又要保證訪問的原子性;

(3)同步是指在保證資料安全時,按照某種特性進行。

三、命名管道

看了匿名管道之後,我們肯定會有疑問,具有親緣關係的管道之間可以進行通訊,那麼幾個不相關的程序之間是否可以進行通呢?這裡我們就引進了命名管道的概念。

2.命名管道的建立

(1)在命令列建立

$ mkfifo filename
(2)從程式裡建立

int mkfifo(const char * filename, mode_t mode);
(3)建立

int main(int argc, char * argv)

四、匿名管道和命名管道的區別

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

2.匿名管道(pipe)和命名管道(fifo)最大的差別就是管道的建立和開啟不同,一旦工作完成後,它們具有相同的語義。

下面,我們用命名管道來實現檔案拷貝

讀取檔案,寫入管道:

#include#include#include#include#include#define err_exit(m)\

do\while (0)

int main(int argc, char * argv)

close(infd);

close(outfd);

return 0;

}

讀取管道,寫入目標檔案:

#include#include#include#include#include#define err_exit(m)\

do\while (0)

int main(int argc, char * argv)

close(infd);

close(outfd);

unlink("tp");

return 0;

}

1 程序間通訊 PIPE(無名管道)

1 在子程序中寫入資料,在父程序中讀取資料 code 結果 now,write data to the pipe the data i wrote is jason s messag now read data from pipe the data from pipe is jason s mess...

程序間通訊(IPC) 管道(Pipe)

管道 乙個程序連線資料流到另乙個程式 pipe函式的原型 include int pipe int file descriptor 2 該閃身在陣列中填上兩個新的檔案描述符後返回0,如果失敗則返回 1。寫到file descriptor 1 的所有資料都可以從file descriptor 0 讀回...

程序間通訊 無名管道PIPE

無名管道pipe 僅在記憶體中存在,檔案系統不可見 無名 有名 管道 管道是一種程序間通訊機制,好比乙個管子,一邊乙個口,乙個往裡放,另一頭可以往出取,操作是雙向的 無名管道特點 只能用於有親緣關係的近緣之間的通訊 單工的通訊模式,具有固定的讀端和寫段 無名管道建立時會返回兩個檔案描述符,分別用於讀...