管道,即匿名管道,是unix系統上非常古老的程序間通訊方法,也是最常用的。它常用於由父子程序之間的通訊,比如在shell中把乙個命令的輸出使用管道傳遞給另乙個命令作為輸入。
#include
int pipe(int filedes[2]);
pipe()系統呼叫可以建立乙個新的管道。成功時返回0,失敗返回-1。呼叫成功後,filedes陣列中會置兩個描述符,其中filedes[0]是讀取端的描述符,filedes[1]是寫入端的描述符。
一般情況下,在管道建立後,會使用fork()來建立子程序。fork()呼叫成功後,子程序會繼承父程序中filedes的兩個檔案描述符。然後根據需求,父程序和子程序使用close()呼叫關閉對應的讀、寫描述符。比如需要子程序傳送資料,父程序讀取資料,那麼子程序則需要關閉讀取端filedes[0],父程序需要關閉寫入端filedes[1]。這一步操作是非常必要的。如果讀取資料的程序不關閉寫入的描述符,那麼對方程序寫入端關閉後,讀取端呼叫read()不會返回0,而是一直阻塞下去。如果寫入資料的程序不關閉讀取的描述符,對方程序關閉讀取描述符後,再次呼叫write()會產生sigpipe訊號。
父程序和子程序結束的時候,記得關閉所有的檔案描述符。
下面的**使用匿名管道實現了父子程序之間的通訊。子程序向父程序傳送10條訊息,子程序退出後,父程序也退出。
#include
#include
#include
#include
#define buf_size 2047
int main()
ret = fork();
if(ret == -1)
if(ret == 0)
close(fds[1]);
exit(0);
}else
else
if(length == 0)
else
}ret = close(fds[0]);
wait(null);
}return
0;}
命名管道 匿名管道
有名字 則可以通過 名字 開啟相同的管道進行通訊,沒有名字 在核心中沒有明確標識 只能通過 子程序複製父程序的方式實現通訊,複製了檔案描述符 匿名管道只能用於具有親緣關係的程序間通訊。只要在建立程序之前建立管道,後邊的程序都可以實現通訊。命名管道可用於同一主機任意程序間通訊 作業系統在核心提供的一塊...
命名管道和匿名管道
我們知道程序間是可以通訊的。可以達到資料傳輸 資源共享 事件通知 程序控制等目的。程序間通訊主要包括管道 系統ipc,套接字等。管道分為三種 1 普通管道 int pipe int fds 2 返回值0表示成功,1表示失敗 fd 0 讀 fd 1 寫 子程序往管道中寫資料,寫資料時要關閉讀端 父程序...
語言 管道 建立匿名管道
本質 特點 實現方式 侷限性 匿名管道 僅適用於有血緣關係的程序通訊.本功能實現的是 ps axu grep bash 通過呼叫 ps 和 grep命令 然後分別將他們的輸出 和 輸入的檔案描述符改變.從終端改入到管道中.intmain int argc,char ar pid t pid fork...