無名管道特性
只能用於有親緣關係的程序(父子程序、兄弟程序)
資料之間單向流動(半雙工)
管道中資料不儲存,資料被讀走後便丟失
管道並不屬於任何檔案系統,只存在於記憶體當中
原函式
#include int pipe(int pipefd[2]);
當使用pipe()函式時需建立包含兩個檔案描述符的陣列:
父子程序間通訊
建立管道
父程序建立子程序(fork()函式)
父程序關閉管道的讀端(close(pipefd[0]))
父程序將資料通過寫端寫入管道
子程序關閉管道寫端(close(pipefd[1]))
子程序通過讀端讀取管道中資料
管道如水管一樣堵住一端才能將水進行存入或取出操作
示例父程序傳資料給子程序:
#include
#include
#include
#include
#include
intmain()
pid =
fork()
;if(pid <0)
else
if(pid >0)
else
return0;
}
原函式
#include #include int mkfifo(const char *pathname, mode_t mode);
呼叫mkfifo()函式後,將會建立乙個檔案格式的命名管道,可以使用對檔案的i/o函式進行操作
命名管道特性
若未設定o_nonblock(非阻塞)模式,當單方向(唯讀或只寫)開啟該管道時將會導致阻塞(程式無法退出),只有同時對管道操作程式才能正常結束,示例:
唯讀管道程式:
#include
#include
#include
#include
#include
intmain()
int fd =
open
("./file"
,o_rdonly)
;printf
("open succse\n");
return0;
}
只寫管道程式
#include
#include
#include
#include
#include
intmain()
int fd =
open
("./file"
,o_wronly)
;printf
("write open succse\n");
return0;
}
編譯後單方面程式執行將會導致阻塞,只有兩程式都執行才能使程式結束。
兩程式互相通訊
示例:
#include
#include
#include
#include
#include
#include
intmain()
;if(mkfifo
("./file"
,0600)==
-1&& errno != eexist)
int fd =
open
("./file"
,o_rdonly)
;printf
("open succse\n");
while(1
)close
(fd)
;return0;
}
#include
#include
#include
#include
#include
#include
intmain()
close
(fd)
;return0;
}
linux 程序通訊 管道通訊
程序通訊 1 pipe 函式的作用 建立無名管道 函式的原型 int pipe int fds 2 函式的引數 新建的兩個描述符fds陣列返回 fds 0 表示管道的讀取端 fds 1 表示管道的寫入端 返回值 成功 0 出錯 1 標頭檔案 include 2 mkfifo 函式的作用 建立有名管道...
linux程序通訊 管道
管道分為有名管道和無名管道。無名管道 無名管道是半雙工的,就是對於乙個管道來講只能讀或者寫。就像高速公路一樣一條路只能單向行駛。建立無名管道的函式 所需要標頭檔案 include 函式原型 int pipe int fd 2 函式的返回值 失敗返回 1,成功返回0 乙個簡單的無名管道的例子 main...
Linux 程序間通訊 管道通訊
管道是 單向的 先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起,乙個程序 寫程序 在管道的尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料 資料被乙個程序讀出之後,將被從管道中刪除,其它讀程序將不能再讀到這些資料,管道提供了 簡單的流控制機制,程序試圖讀空管道時,程序將阻塞,同樣,...