管道是linux系統上兩個程序之間的一種通訊方式。函式popen()複製了乙個子程序,並建立乙個連線這個子程序的管道.根據管道的方向,子程序可以通過讀自己的標準輸入來讀管道,或者通過寫自己的標準輸出寫管道.
popen()函式呼叫需要乙個命令列字串,並定義管道的讀寫屬性.它就能像由函式fope()開啟的一樣,進行使用.任何能夠用於讀檔案的函式,都能夠用於讀管道.唯一不同的是,必須用函式pclose()而不是fclose()來關閉管道.
下面的例子用於實現:命令ls將執行結果寫到標準輸出,因此可以在程式中建立管道獲取ls的輸出.
/* pipein.c */
#include
int main(int argc, char *ar**)
//注意在函式printf()中不需要換行符,這是由於函式fgets()如同操作檔案一樣來操作管道,在輸入行中已包含了換行符.
while (fgets(instring, sizeof(instring), pd) != null)
pclose(pd);
return 0;
}此函式會讀取並顯示由ls命令找到的檔名.
不帶引數執行的cat命令將從標準輸入中讀取,並輸出到標準輸出.
/* pipeout.c */
#include
int main(int argc, char *ar**)
fputs("the first string to cat \n", pd);
fflush(pd);
sleep(5);
fputs("the second string to cat \n", pd);
fflush(pd);
pclose(pd);
return 0;
}此程式將開啟乙個管道,傳送字元到cat命令,就好像是從終端輸入的一樣.
由於管道是以」w」方式開啟的,程式就可以對它進行寫操作,函式fputs()將字串送到cat命令,後者再將它們寫到標準輸出,這樣字元就顯示在螢幕上.呼叫函式fputs()的原因在於管道是完全快取的,真正的輸出資料只在快取已滿或者關閉管道時才傳送.而管道資料的快取是沒有大小限制的,因為它將資料存在磁碟中,所以寫管道時永遠不會阻塞.這就意味著你可以將所有命令和資料排隊,而由子程序按它自身的步調來讀取資料.
Linux 管道通訊
一 定義 管道是單向的 先進先出的。它將乙個程式的輸入和另乙個程式的輸出連線起來。資料被乙個程序讀出後,將被從管道中刪除。分為無名和有名管道兩種。前者用於父程序和子程序間的通訊,後者用於同一系統的兩個程序間通訊。二 無名管道 int pipe int fd 2 其中,fd 0 用於讀管道,fd 1 ...
Linux管道通訊
現在在linux 中使用較多的程序間通訊方式主要有以下幾種。1 管道 pipe 及有名管道 named pipe 管道可用於具有親緣關係程序間的通訊,有名管道,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊。2 訊號 signal 訊號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通訊...
linux 管道通訊
無名管道 1 管道是半雙工的,只能支援資料的單向流動 兩程序間需要通訊時需要建立起兩個管道 2 使用無名管道通訊的程序必須擁有公共祖先程序 pipe 1 標頭檔案 include 2 定義函式 int pipe int filedes 2 3 函式說明 pipe 會建立管道,並將檔案描述詞由引數fi...