程序間通訊 管道

2021-08-02 19:06:27 字數 1171 閱讀 7956

管道的本質其實就是乙個檔案,程序可以對其進行讀或寫,從而實現程序間的通訊。

無名管道

建立單向資料流無名管道**為:

int pipe(int fd[2]);
該函式返回兩個檔案描述符:fd[0]用於讀,fd[1]用於寫。管道被建立與核心態。

管道乙個典型而常見的例子:

ls | sort | grep ***
其中,shell將執行上述步驟,建立三個程序和兩個管道,並且將每個管道的讀出端複製到相應程序的標準輸入,將每個管道的寫入端複製到相應程序的標準輸出。

管道實現程序間通訊,是通過核心運作完成的,讀寫管道時,資料都要穿過使用者-介面。

無名管道只能用於有乙個共同祖先程序的各個程序之間,無法在無親緣關係的兩個(或多個)程序間進行通訊,通常用於父程序和子程序之間的通訊(因為建立管道時,沒有返回固定的檔名,注意:這是在不考慮描述符傳遞的基礎上)。

有名管道(fifo)

fifo(first in first out)是乙個單向資料流,因為每個fifo都有乙個路徑名與之關聯,所以沒有親緣關係的程序之間,也可以訪問同乙個fifo,從而實現程序間的通訊。

建立有名管道**為:

int mkfifo(const

char *pathname, mode_t mode);

核心為管道和fifo維護乙個訪問計數器,它的值是訪問同乙個管道或fifo的開啟著的描述符個數。有了這個計數器,即使某個程序刪除了fifo的乙個路徑名,但目前仍開啟著的描述符卻不會被影響,也就是說,不會影響這在使用該fifo的其他程序。

上面說的pipe函式建立的是半雙工管道(單向資料流),但也有一些系統實現的pipe函式是建立乙個全雙工管道(雙向資料流)。

全雙工管道是由兩個半雙工管道構成的,fd[1]寫入的資料,只能從fd[0]讀出;寫入fd[0]的資料只能從fd[1]讀出。

管道通常以位元組流i/o模型來傳遞資訊,位元組流i/o模型的特點是:不存在記錄邊界,讀寫操作根本不檢查資料,系統也不對其進行解釋。這些解釋和檢查工作,都由讀寫的應用程序負責。

那如果要傳遞的首席資訊官度可變,且讀資料的程序需要知道訊息邊界,以判定在什麼時候讀出單條訊息?可以有三種解決方法:

程序間通訊 管道

include int pipe int fd 2 返回值 若成功,返回0,若出錯,返回 1經由引數fd返回兩個檔案描述符 fd 0 為讀而開啟,fd 1 為寫而開啟。fd 1 的輸出是fd 0 的輸入。else if pid 0 子程序 else else if pid 0 父程序 printf ...

程序間通訊 管道

原文 程序間通訊 管道 管道簡介 常說的管道都是匿名半雙工管道,匿名半雙工管道在系統中是沒有實名的,並不可以在檔案系統中以任何方式看到該管道。它只是程序的一種資源,會隨著程序的結束而被系統清除。管道通訊是在unix系統中應用比較頻繁的一種方式,例如使用grep查詢 ls grep ipc 顧名思義,...

程序間通訊 管道

程序間通訊,又稱為ipc,包含以下型別 半雙工管道fifo 全雙工管道 訊息佇列 訊號 訊號量共享記憶體 套接字socket streams。一,管道是unix系統ipc的最古老形式,他具有兩種侷限性 1 資料只能在乙個方向上流動 2 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...