管道是unix中一種程序間通訊的方法,我們把從乙個程序鏈結到另外乙個程序的資料流稱為「管道」。
管道是最像佇列的一種程序間通訊模型,生產者的程序在管道的寫端寫入資料,消費者的程序在管道的讀端進行讀取資料,這個過程類似於佇列,區別就是我們並不需要關心使用的管道的執行緒安全和記憶體分配等瑣碎的事情,這些事情都是由作業系統為你完成。
管道分為命名管道和匿名管道。
匿名管道也稱為無名管道,由於我們需要在父子程序進行通訊,交換資料,此時就有了匿名管道,匿名管道是由pipe進行建立的。
匿名管道是半雙工的,資料智慧型向乙個方向流動,此時如果我們需要建立起雙方的通訊,則這個時候就需要建立兩個管道。
管道的宣告週期隨程序而定,程序退出的時候管道被釋放
由於匿名管道是在乙個相關的兩個程序之間進行交換資料,此時如果我們需要在不同的父子程序之間進行資料的交換,此時就出現了命名管道。
命名管道也叫具名管道,它相當於建立乙個檔案,通過乙個程序讀,乙個程序來寫完成程序間通訊。
例一:管道的寫入與讀出
從鍵盤中獲取輸入,寫入管道,並從管道的另外一端,讀出資料
#include
#include
#include
#include
int main(void)
}
執行結果
例二:用fork()來管理管道的共享
由圖例我們可知共享管道的三個步驟,先把檔案描述符連線到管道的讀端和寫端,接著fork出子程序,最後關閉父程序的讀端和子程序的寫端,就可達到父程序寫,子程序讀的目的。
#include
#include
#include
#include
#include
int main(void)
//子程序從管道接收資訊
close(fds[1]);
char buf[1024] = ;
read(fds[0],buf,1024);
printf("buf = %s\n",buf);
return
0;}
1、當管道中沒有資料可讀時:若pipe採取的是不阻塞方法,則直接read返回-1;採取是阻塞時,程序阻塞直到等待資料可以讀;
2、當管道滿時:採用不阻塞方式將呼叫返回-1;反之write阻塞,直到有程式讀走資料。
1、沒有資料可讀的時候
2、當管道內資料滿了的時候
管道內資料滿了,此時write呼叫會被阻塞,直到有程序讀走資料。
命名管道的建立有兩個方法:
#include
#include
int mkfifo(const
char *pathname, mode_t mode);
int main()
執行結果為:
事例一:
命名管道實現簡單的server和client通訊。
整體思路就是乙個建立管道,不停的向管道輸入資料,另外乙個讀出管道內容即可。
實現效果如下圖:
**如下:
myclient.c
#include
#include
#include
#include
#include
int main(int argc, char argv)
else}}
myserver.c
#include
#include
#include
#include
#include
#include
#include
int main()
else
if (s == 0)
else
perror("read"), exit(1);}}
事例二:實現檔案的拷貝
由於命名管道相當於乙個檔案,所以我們可以建立乙個命名管道,同時向命名管道寫入內容,另外乙個程式讀取管道內的內容,寫入目標檔案即可。
匿名管道由pipe函式建立並開啟
命名管道由mkfifo函式建立。開啟用open
fifo(命名管道),與pipe(匿名管道)唯一的區別就是它們建立和開啟的方式不同,一旦他們完成自己的工作後,他們具有相同的意義。
Linux程序間通訊 管道
linux程序間通訊機制 1.同一主機程序間通訊機制 unix方式 有名管道fifo 無名管道pipe 訊號signal systemv方式 訊號量 訊息佇列 共享記憶體 2.網路通訊 rpc remote procedure call socket 管道管道是程序間通訊中最古老的方式,它包括無名管...
Linux程序間通訊 管道
管道 管道是一種最基本的程序間通訊機制,由pipe函式建立 include intpipe int filedes 2 呼叫pipe函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程式兩個檔案描述符,filedes 0 指向管道的讀端,f...
Linux 程序間通訊 管道
程序間通訊 a程序怎樣將 hello world 傳遞給b程序 i 利用檔案實現 需要乙個 中間人 進行傳遞 檔案 在磁碟中儲存 a先呼叫open函式開啟檔案,再用write函式寫檔案,b用read函式讀取檔案,但問題如下 1.如果a傳送了資料b進行了接收,但a的資料沒有被清空 2.如果a傳送了資料...