關於程序間通訊:
ipc
每個程序
各自有不同的使用者位址空間
,任何乙個程序的全域性變數在另乙個程序中都看不到所以程序之間要交換資料必須通過核心,
在核心中開闢一塊緩衝區,
程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊 (ipc,interprocess com)
匿名管道
管道:pipe
沒有名字的匿名管道是一種最基本的
ipc機制,由
pipe
函式建立
: 呼叫pipe函式時在核心中開闢一塊緩衝區(稱為管道)用於通訊,它有乙個讀端乙個寫端,然後通 過filedes引數傳出給使用者程式兩個檔案描述符:
1.filedes[0] :指向管道的讀端
2.filedes[1] :指向管道的寫端
(很好記,就像0是標準輸入1是標準輸出一樣)。所以管道在使用者程式看起來就像乙個開啟 的檔案,通過read(filedes[0]);或者write(filedes[1]);向這個檔案讀寫資料其實是在讀寫核心緩衝區。
pipe函式呼叫成功返回0,呼叫失敗返回-1, 開闢了管道之後如何實現兩個程序間的通訊呢
?看下面:
父程序建立管道,父程序fork出子程序,現在就有連個有血緣關係的父子程序,下面要說的就是兩程序間的通訊:
存在於兩個程序間的管道,兩遍都有讀和寫的功能,匿名管道是單向的,能寫就不能讀,能讀就不能寫,所以,圖3中,父程序關閉了讀端,也就意味著,父親要寫資料到管道;而子程序關閉了寫端,也就意味著,子程序只能讀管道間的資料,這樣就完成了一次程序間的通訊。有專業一點的術語講原理,是這樣的:
1. 父程序呼叫pipe開闢管道,得到兩個檔案描述符指向管道的兩端。
2. 父程序呼叫fork建立子程序,那麼子程序也有兩個檔案描述符指向同一管道。
3. 父程序關閉管道讀端,子程序關閉管道寫端。父程序可以往管道裡寫,子程序可以從管道裡讀,管道是用環形佇列實現的,資料從寫端流入從讀端流出,這樣就實現了程序間通訊。
演示**:
(黏貼沒啥意思,自己敲,發現問題)
上文有提到說:有血緣關係,單向之類的關鍵字,下面就說說匿名管道這種通訊機制的條件或者說限制:
1.兩個程序通過乙個管道只能實現單向通訊。比如上面的例子,父程序寫子程序讀,如果有時候也需要子程序寫父程序讀,就必須另開乙個管道。
2.管道的讀寫端通過開啟的檔案描述符來傳遞,因此要通訊的兩個程序必須從它們的公共祖先那裡繼承管道檔案描述符。上面的例子是父程序把檔案描述符傳給子程序之後父子程序之間通訊,也可以父程序fork兩次,把檔案描述符傳給兩個子程序,然後兩個子程序之間通訊, 總之需要通過fork傳遞檔案描述符使兩個程序都能訪問同一管道,它們才能通訊。 也就是說,管道通訊是需要程序之間有關係。
使用管道需要注意以下4種特殊情況(假設都是阻塞i/o操作,沒有設定o_nonblock標誌):
1.如果所有指向管道寫端的檔案描述符都關閉了(管道寫端的引用計數等於0),而仍然有程序從管道的讀端讀資料,那麼管道中剩餘的資料都被讀取後,再次read會返回0,就像讀到檔案末尾一樣。
2.如果有指向管道寫端的檔案描述符沒關閉(管道寫端的引用計數大於0),而持有管道寫端的程序也沒有向管道中寫資料,這時有程序從管道讀端讀資料,那麼管道中剩餘的資料都被讀取後,再次read會阻塞,直到管道中有資料可讀了才讀取資料並返回。
3.如果所有指向管道讀端的檔案描述符都關閉了(管道讀端的引用計數等於0),這時有程序向管道的寫端write,那麼該程序會收到訊號sigpipe,通常會導致程序異常終止.
4.如果有指向管道讀端的檔案描述符沒關閉(管道讀端的引用計數大於0),而持有管道讀
端的 程序也沒有從管道中讀資料,這時有程序向管道寫端寫資料,那麼在管道被寫滿時再次write會阻塞,直到管道中有空位置了才寫入資料並返回。
以上是四種需要注意的地方。
匿名管道總結到此,其餘通訊機制見下篇博文;
賜教!
Linux程序間通訊(匿名管道)
管道 管道是linux中很重要的一種通訊方式,是通過把乙個程式的輸出直接連在另乙個程式的輸入實現通訊的,常說的管道是指匿名管道,它與有名管道之間的最大區別就是只能用於父子程序之間。管道是一種最基本的ipc機制,由pipe函式建立 include int pipe int fileds 2 呼叫pip...
Linux程序間通訊 匿名管道
關於程序間通訊 ipc 每個程序 各自有不同的使用者位址空間 任何乙個程序的全域性變數在另乙個程序中都看不到所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊 ipc,interproc...
程序間通訊 匿名管道
最近實現乙個遠端超級終端的功能,通訊模式是這樣的 客戶端 通過網路傳送cmd命令到 伺服器端 通過程序間通訊 管道 將此cmd命令發給 cmd.exe程式,cmd.exe執行此cmd命令 接下來 cmd.exe 程式將執行結果返回 伺服器端 傳送此次結果到 客戶端,客戶端對結果進行顯示 其中伺服器端...