管道通訊的學習筆記

管道通訊是一種非常方便的信息交流方式,可以非常方便的實現數據交換。一般用在不同進程之間進行數據交換。

管道通訊的核心機制是文件讀寫,幾大流行操作系統都將管道抽象成文件,定義了read和write接口,用於數據讀寫。

管道分爲匿名管道與命名管道兩種,在linux中這兩種管道的實現都基於文件系統,在windows中匿名管道的實現基於文件,而命名管道的實現基於socket通訊,是一種網絡通信方式,因此可以實現跨網絡通訊,聽起來很強大,但是確實很雞肋的特性,因此不談。

在操作系統看來,管道就是一個普通的文件,進程可以對這個文件進行讀寫操作,而且是自帶鎖機制的,當一個進程在讀管道內容的時候,其它進程會停止寫入,直到其中內容全部讀出,讀取內容的進程會掛起,之後其它進程搶奪該文件的控制權,對該文件進行讀寫操作。

匿名管道被開發出來的主要用途就是用於重定向IO流。他主要用於shell操作時候,連接兩個進程的標準輸入輸出,有過linux操作經驗的用戶應該很容易理解。在linux中大量的使用了管道技術來連接不同進程,實現通訊,他將前一個進程的標準輸出信息寫入後一個進程的標準輸入。

匿名管道常常用於shell使用中,還可以利用系統函數創建管道,系統函數創建的管道作爲一個普通文件,一般會返回一個文件句柄用來讀寫。對於匿名管道來說,需要將生成的子進程的標準輸入和標準輸出利用管道文件句柄進行替換,這樣就可以實現表進程與子進程的交互。

作爲一個程序來說,一般擁有三個信息點(參數接受,標準輸入,標準輸出),我們最容易將這三者混爲一談,原因就是在系統的shell程序中,這三者都是以字符串形式在屏幕上打印的。但是需要強調一點,這三者是完全不同的東西。

 參數:用於程序調用,在程序啓動的最初傳進程序的main函數,用於實現選項功能,但是隻能傳遞一個字符串數組進來,此緩衝區一次調用中恆定不變,而且不可重新賦值;

 標準輸入:用於程序輸入,可以不斷的寫入數據,需要利用系統函數才能讀寫其中內容,最容易與系統調用參數混淆,其實,一般是在shell中啓動程序之後,程序沒有退出而且需要由人輸入信息的時候,這個時候纔是進入了標準輸入。

 標準輸出:用於程序輸出,當程序輸出任何東西,都會被打印到shell屏幕上。是調用後的結果。

匿名管道的作用就是重定向標準輸入輸出,因此對於一個子進程而言頂多架設兩個匿名管道,一個用於輸入,一個用於輸出。如果需要更多通道,只能使用其它技術。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章