程序間通訊,又稱為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 指...