管道是一種最基本的ipc機制,由pipe函式建立:
#include
int pipe(int filedes[2]);
呼叫pipe函式時在核心中開闢一塊緩衝區(稱為管道)用於通訊,它有乙個讀端乙個寫端,然後通
過filedes引數傳出給使用者程式兩個檔案描述符,filedes[0]指向管道的讀端,filedes[1]指向管道的
寫端(很好記,就像0是標準輸⼊1是標準輸出一樣)。所以管道在使用者程式看起來就像乙個開啟
的檔案,通過read(filedes[0]);或者write(filedes[1]);向這個檔案讀寫資料其實是在讀寫核心緩衝
區。pipe函式呼叫成功返回0,呼叫失敗返回-1。
1父程序呼叫pipe開闢管道,得到兩個檔案描述符指向管道的兩端。
2. 父程序呼叫fork建立⼦程序,那麼子程序也有兩個檔案描述符指向同一管道。
3. 父程序關閉管道讀端,子程序關閉管道寫端。父程序可以往管道裡寫,子程序可以從管道⾥
讀,管道是用環形佇列實現的,資料從寫端流入從讀端流出,這樣就實現了程序間通訊。 例如
#include#include#include#include#includeint main()
; if(pipe(fds)<0)
pid_t id=fork();
if(id==0)
close(fds[1]);
} else
printf("father msg from child:%s",buf);
if(waitpid(id,null,0)<0)
}} return 0;
}
結果
pipe建立匿名管道
pipe建立的管道為匿名管道,匿名管道只能在有關係的程序之間使用,例如父程序和子程序,由同乙個父程序建立的子程序或稱為兄弟程序 如圖所示若管道只有乙個,並且管道只能程序單向通訊,因此,在子程序繼承父程序的檔案描述符之後,父程序關閉fd 0 檔案描述符,子程序關閉fd 1檔案描述符,這樣父程序和子程序...
Linux 匿名管道pipe與命名管道FIFO
什麼是管道 功能 建立匿名管道 引數 fd 檔案描述符陣列,其中fd 0 表 示讀端,fd 1 表 示寫端 返回值 成功返回0,失敗返回錯誤 實現 include include include include int main memset buf,0x00,sizeof buf 從管道中讀取 i...
linux管道通訊(pipe)
linux pipe適合於父子程序之間進行通訊。如下面 所示 include include include int main create sub process pid fork if 1 pid else if 0 pid else return 0 當呼叫fork函式後,fork將會返回兩個...