時隔很久,再來更博...
今天主要寫的是linux中程序間通訊,程序間進行通訊的目的就是多個程序之間資料互相交換。
程序間通訊方式有以下幾種:
1、訊號
2、管道:分為有名管道和無名管道
3、訊號量
4、訊息佇列
5、共享儲存(共享記憶體)
6、套接字(socket)
其中套接字屬於多機通訊(全雙工通訊),其餘的屬於單機通訊(半雙工通訊),所謂的半雙工通訊就是在同一時刻裡資訊只能有乙個傳輸方向,生活中的例子比如對講機。全雙工通訊即通訊的雙方可以同時傳送和接受訊息。
管道原理:
這次我們主要講管道中的有名管道。需要注意的是
在記憶體中建立乙個管道,他不屬於程序。
有名管道:應用於任意兩個程序之間資料的單向傳遞。在檔案目錄樹中有乙個檔案標示(管道檔案),實際不佔據磁碟空間,資料快取在記憶體上。
下來我們來看看其具體操作:
1、建立:命令方式:mkfifo 函式方式:mkfifo
2、開啟:open
3、寫資料:write
4、讀資料:read
5、關閉:close
linux中一切皆檔案,所以開啟,讀寫,關閉操作和檔案操作一樣。
下面我們寫乙個例子:程序a將"hello word"寫入管道,程序b從管道中讀取"hello word"並列印出來。
執行時我們會發現不論先執行之中哪乙個可執行檔案,都會發生阻塞,結果出不來。
我們先執行a,會發現:
我們再開乙個終端執行b後,程式就正常執行。
出現上面的現象這是因為阻塞執行函式。
阻塞執行函式:函式呼叫以後不會立即返回,需要等待某些條件的發生才會返回,open操作管道檔案時,會阻塞執行的函式。
如果我們再a.c中加入sleep(10),讓他睡眠10秒在執行後面的程式,會出現什麼情況呢?
先執行a再執行b後出現了如下情況
過了10秒後出現以下結果
分析:執行後出現了fifo open success的字樣不過沒有結果,因為在write前a sleep了10秒,所以沒有將東西寫入管道,b就在等待a寫入,所以就阻塞在那裡,直到a寫入後,b從管道裡讀取,並列印出來。
如果乙個程序以只寫的方式開啟乙個管道檔案,open會阻塞執行,直到有乙個程序以讀的方式開啟管道檔案,open才會返回,程序才會接著執行。
如果乙個程序以唯讀的方式開啟乙個管道檔案,open會阻塞執行,直到有乙個程序以寫的方式開啟管道檔案,open才會返回,程序才會接著執行。
簡單來說,寫入了才會讀,要讀必須要寫入。
read函式也會阻塞執行,直到寫端寫入資料或者所有的寫端都關閉。
read函式讀取資料並且會將記憶體上的已讀資料清空。
程序間通訊 管道(有名管道)
前幾天我們簡單的介紹了程序間通訊的一種渠道 管道,我們有說道管道的概念,管道的通訊原理,還提到了管道的兩種型別 有名管道和無名管道,今天我們就來說說有名管道吧 基本概念 有名管道在檔案目錄中有乙個檔案標示 管道檔案 實際不佔據磁碟空間。資料快取在記憶體上 只有使用時記憶體才開闢,由於在記憶體上,因此...
程序間通訊(管道和有名管道)
管道 pipe 是兩個程序之間進行單向通訊的機制,因為它的單向性,所以又稱為半雙工管道。它主要用於程序間的一些簡單通訊。資料只能由乙個程序流向另乙個程序 乙個寫管道,乙個讀管道 如果要進行全雙工通訊,需要建立兩個管道。管道只能用於父子程序或者兄弟程序之間的通訊。管道沒有名字,且其緩衝區大小有限。乙個...
Linux 程序間通訊(管道及有名管道FIFO)
一.管道 1.只能用於具有親緣關係的程序之間的通訊 2.半雙工通訊模式 3.一種特殊的檔案,是一種只存在於核心中的讀寫函式 管道基於檔案描述符,管道建立時,有兩個檔案描述符 a.fd 0 固定用於讀管道 b.fd 1 固定用於寫管道 建立管道 pipe 一般步驟 1.pipe 建立管道 2.fork...