程式間通訊(一)管道

眷戀0110發表於2017-10-20

程式間通訊:多個程式之間資料交換。

程式間通訊方式:訊號、管道、訊號量、訊息佇列、共享記憶體、套接字(socket)

程式建立:pid_t  fork

程式間資料共享問題:

               全域性變數、堆、棧       不共享

               檔案                             共享

按照訊號傳送方向與時間的關係,資料通訊可以分為三種型別:單工通訊、半雙工通訊、全雙工通訊。

            單工通訊:訊號只能向一個方向傳輸,任何時候都不能改變訊號的傳送方向。

            半雙工通訊:訊號可以雙向傳遞,但是必須是交替進行,一個時間只能向一個方向傳送。

            全雙工通訊:訊號可以同時雙向傳遞。

管道在同一時刻只能是半雙工通訊。


有名管道:在檔案目錄樹中有一個檔案標示(管道檔案),實際不佔磁碟空間,資料快取在記憶體上。

                  應用於任意兩個程式之間資料的單向傳遞。

具體操作

       建立:(命令方式)mkfifo         (函式方式)mkfifo()

       開啟:           open

       寫資料:        write

       讀資料:        read

       關閉:           close


maina.c檔案



mainb.c檔案                                                                                                                                                       



阻塞執行函式:函式呼叫以後並不會立即返回,需要等待某些條件的發生才會返回。例如open操作管道檔案時,阻塞執行的函式。

        如果一個程式以只寫方式開啟一個管道檔案時,open會阻塞執行,直到有一個程式以只讀方式開啟管道,open才會返回,程式才會接著執行。

        read函式也會阻塞執行,直到寫端寫入資料或者所有寫端都關閉。read讀取資料會將記憶體上的資料清空。


無名管道:相對於有名管道而言,無名管道在使用時產生,不使用後釋放,並不會在系統上留下任何蛛絲馬跡。

                   無名管道因其在使用前沒有任何的標示,所以它只能應用於父子程式之間。


       ps:管道都是半雙工通訊,而無名管道建立後,父程式在fork產生子程式後,兩程式分別有一對讀寫端。

       fork之後,要麼子程式關閉讀端父程式關閉寫端,要麼子程式關閉寫端父程式關閉讀端。














相關文章