華清遠見嵌入式學院
講師。區別於無名管道,命名管道可以用於沒有親緣關係的程序之間進行通訊,且命名管道在一些特點上更類似於檔案,其具有檔名,檔案屬性及存放路徑等資訊,也就是說利用命名管道進行操作後,我們可以在相應的路徑下查詢到它,更方便程式設計的需要和操作,且命名管道嚴格地遵循先進先出原則。
命名管道在建立成功後,就可以與普通檔案的開發設定一樣了,下面通過乙個例子我們來說明一下命名管道的使用及注意事項,假設情境:我們需要兩個程序進行資料的交換,那麼建立命名管道後,乙個程序負責向管道內寫入資料,另乙個程序負責由管道讀出資料。**段如下:
//寫端**
#include
#include
#include
#include
#include
int main()
fd = open("fifo",o_wronly); //開啟管道檔案
if(fd<0) //開啟是否成功,不成功則退出程式
write(fd,"hello",6); //進行寫端操作
close(fd);
unlink("fifo"); //刪除命名管道 *
return 0;
}//讀端**
#include
#include
#include
#include
#include
int main()
read(fd,str,sizeof(str)); //進行讀取操作
printf("%s/n",str); //將讀取到的資料進行列印輸出
close(fd);
return 0;
}上述兩個程式分別編譯鏈結成可執行程式,且同時執行於2個終端上,進行執行效果的觀察。
1、管道建立成功後,可以像操作普通檔案一樣進行操作,但是,兩個程序開啟乙個命名管道的時候,必須分別以」只「的方式開啟,且必須相反,即乙個程序以唯讀方式開啟,另一程序以只寫方式開啟。
2、在終端上單獨執行寫端程式時,會發現,終端無任何反應,而讀端程式一旦開始執行,則兩個程式同時結束,說明命名管道只開啟一端的話是無法成功的,此時open是無法正常返回的,也就是說管道兩端需要同時開啟,這也是命名管道的乙個特點。
3、寫端**中標記為「*」的語句作用為刪除命名管道,可將該句暫時注釋掉,則在程式結束後,可在當前路徑下可以找到乙個名為「fifo」的檔案,且其檔案屬性為「p」,為管道型別檔案,這也是區別於無名管道的一大特點,使用結束後可以找到具體檔案,所以命名管道是可以應用於無親緣關係的程序間的。
另外,在建立管道的時候,如果指定路徑下存在乙個與命名管道同名的檔案,則編譯器提示命名管道未建立成功,為避免後期使用出現問題,通常在使用命名管道後予以刪除操作。
命名管道的簡單使用
華清遠見嵌入式學院 講師。區別於無名管道,命名管道可以用於沒有親緣關係的程序之間進行通訊,且命名管道在一些特點上更類似於檔案,其具有檔名,檔案屬性及存放路徑等資訊,也就是說利用命名管道進行操作後,我們可以在相應的路徑下查詢到它,更方便程式設計的需要和操作,且命名管道嚴格地遵循先進先出原則。命名管道在...
mysql使用命名管道 命名管道
管道是用於相關過程之間的通訊。我們是否可以使用管道進行不相關的程序通訊,比方說,我們要從乙個終端執行客戶端程式,從另乙個終端執行伺服器程式?答案是否定的。那麼怎樣才能實現不相關的程序通訊,簡單的答案就是使用 命名管道。即使這適用於相關的程序,但是使用命名管道進行相關的程序通訊沒有任何意義。我們使用乙...
命名管道的使用
我在工作中碰到了乙個這樣的問題,有兩個程式,第乙個程式會fork乙個程序exec呼叫第二個程式,這樣呼叫後,第乙個程式還是繼續執行父程序的。我要求第乙個程式的父程序停止執行,直到第二個程式退出或執行到某個時候才繼續執行。下面是兩個例子程式的 先執行gui程式,再執行player程式 gui 在後台執...