命名管道的簡單使用
時間:2017-01-05作者:華清遠見
區別于無名管道,命名管道可以用于沒有親緣關系的進程之間進行通信,且命名管道在一些特點上更類似于文件,其具有文件名,文件屬性及存放路徑等信息,也就是說利用命名管道進行操作后,我們可以在相應的路徑下查找到它,更方便編程的需要和操作,且命名管道嚴格地遵循先進先出原則。 命名管道在創建成功后,就可以與普通文件的開發設置一樣了,下面通過一個例子我們來說明一下命名管道的使用及注意事項,假設情境:我們需要兩個進程進行數據的交換,那么創建命名管道后,一個進程負責向管道內寫入數據,另一個進程負責由管道讀出數據。代碼段如下:
//寫端代碼
int main()
write(fd,"hello",6); //進行寫端操作
//讀端代碼
int main()
read(fd,str,sizeof(str)); //進行讀取操作 上述兩個程序分別編譯鏈接成可執行程序,且同時運行于2個終端上,進行執行效果的觀察。 命名管道在使用時,需要尤其注意以下3點,大家可以對照上面的程序段體會: 1、管道創建成功后,可以像操作普通文件一樣進行操作,但是,兩個進程打開一個命名管道的時候,必須分別以”只“的方式打開,且必須相反,即一個進程以只讀方式打開,另一進程以只寫方式打開。 2、在終端上單獨運行寫端程序時,會發現,終端無任何反應,而讀端程序一旦開始運行,則兩個程序同時結束,說明命名管道只打開一端的話是無法成功的,此時open是無法正常返回的,也就是說管道兩端需要同時打開,這也是命名管道的一個特點。 3、寫端代碼中標記為“*”的語句作用為刪除命名管道,可將該句暫時注釋掉,則在程序結束后,可在當前路徑下可以找到一個名為“fifo”的文件,且其文件屬性為“p”,為管道類型文件,這也是區別于無名管道的一大特點,使用結束后可以找到具體文件,所以命名管道是可以應用于無親緣關系的進程間的。 另外,在創建管道的時候,如果指定路徑下存在一個與命名管道同名的文件,則編譯器提示命名管道未創建成功,為避免后期使用出現問題,通常在使用命名管道后予以刪除操作。
發表評論
|