管道主要用於程序之間的通訊,而pipe管道主要用於具有親戚關係的程序之間進行通訊,也叫匿名管道。以下是幾個測試demo
1,通過主程序作媒介來實現兩個子程序之間的通訊
思路:主程序與兩個子程序之間分別建立管道,乙個用於從子程序輸入資料到主程序,另乙個管道用於從子程序輸出資料到另乙個子程序,**如下:
#include
#include
#include
#include
#include
#include
int main()
pid_t childa = fork();//建立乙個子程序,用於寫
pid_t childb = fork();//建立乙個子程序,用於讀
if (childa ==-1 || childb ==-1)
else if (childb==0)
while(1)
}else if (childa>0 && childb>0)
if((close(pipefd2[1]))==-1)
while(1)//迴圈寫入內容
}else if (childa == 0)
while(1)
}return 1;
}終端輸入輸出資訊如下:
2,兩個子程序通過pipe直接傳輸資料,不通過主程序
#include
#include
#include
#include
#include
#include
int main()
pid_t childa = fork();//建立乙個子程序,用於寫
pid_t childb = fork();//建立乙個子程序,用於讀
if (childa == -1 || childb == -1)
if (childa == 0)
while(1)
}if (childb == 0)
while(1)
}if (childa >0 && childb >0)
}return 0;
}終端列印出來的結果:
3,由於pipe是一種半雙工的通訊方式,如過要是實現兩個子程序之前能夠同時進行雙向傳輸,實現全雙工,必須要建立兩個資料流向相反的管道(注:原則上也可通過只建立乙個通道,然後close()來改變傳輸方向來實現雙向傳輸,但乙個通道無法實現同時雙向傳輸),雙管道傳輸**如下:
#include
#include
#include
#include
#include
#include
void writethread(int fd,char* buf,const char* name)
}int main()
pid_t childa = fork();
pid_t childb = fork();
if (childa == -1 || childb == -1)
if (childa == 0)
if ((close(pipefds2[1]))==-1) // 對於管道2,程序a唯讀
std::thread t(writethread,pipefds1[1],buf1,"childa");
t.detach();
while(1)
}if (childb == 0)
if((close(pipefds2[0]))==-1)//對於管道2,程序a只寫
std::thread t(writethread,pipefds2[1],buf2,"childb");
t.detach();
while(1)
}if (childa >0 && childb >0)
}return 0;
}終端輸入和輸出:
注:關於fork函式的用法及作用可參考這個老哥的部落格:
Linux下的無名管道pipe的設計
1.函式說明 pipe 建立管道 1 標頭檔案 include 2 定義函式 int pipe int filedes 2 3 函式說明 pipe 會建立管道,並將檔案描述詞由引數filedes陣列返回。filedes 0 為管道裡的讀取端 filedes 1 則為管道的寫入端。4 返回值 若成功則...
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將會返回兩個...
linux 匿名管道pipe
管道是一種最基本的ipc機制,由pipe函式建立 include int pipe int filedes 2 呼叫pipe函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通 過filedes引數傳出給使用者程式兩個檔案描述符,filedes 0 指向管道的讀端,file...