關於linux下pipe管道的用法

2021-10-05 02:56:54 字數 2158 閱讀 3564

管道主要用於程序之間的通訊,而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...