程序間通訊 管道

2021-07-23 08:54:28 字數 996 閱讀 6433

程序間通訊,又稱為ipc,包含以下型別

半雙工管道fifo

全雙工管道

訊息佇列 訊號

訊號量共享記憶體

套接字socket

streams。。

一,管道是unix系統ipc的最古老形式,他具有兩種侷限性

1、資料只能在乙個方向上流動

2、只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該程序呼叫fork,

此後父、子程序之間就可應用該管道。

管道叫pipe,而有名管道叫fifo。

pipe,無名管道只能父子程序間通訊

有名管道fifo能在系統中的任意兩個程序間通訊

管道的建立方式:

#include

int pipe(int filedes[2]);

filedes 檔案描述符

filedes[0]用於讀管道, filedes[1]用於寫管道.

關閉管道只需要關閉兩個檔案描述符即可,可以使用close函式。

父子程序通訊

建立管道錢先呼叫pipe,否則子程序不會繼承檔案描述符。

另外要注意的是, 呼叫fork之後做什麼取決於我們的資料流的方向, 對於父程序到子程序

的管道, 父程序關閉管道的讀端 fd[0], 子程序關閉管道的寫端fd[1]。 

當讀乙個寫端已經被關閉的管道時, 所有資料被讀取之後, read函式呼叫後將返回0,。

當寫乙個讀端已經被關閉的管道, 則會產生訊號sigpipe, write返回-1, errno設定為epipe

在寫管道的時候, 管道緩衝區的大小由 pipe_buf決定。用pathconf活則會fpathconf函式可以確定pipe_buf的值

二、建立有命名管道

#include  

#include

int mkfifo(const char *pathname, mode_t mode)

pathname : fifo檔名

mode : 建立屬性

程序間通訊 管道

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機制,由pipe函式建立。include int pipe int fileds 2 呼叫pipe函式時在記憶體中開闢一塊緩衝區 就稱為管道 用於通訊,它有乙個讀端和乙個寫端,通過函式引數傳給使用者程式兩個檔案描述符,fileds 0 指向管道的讀端,fileds 1 指...