Linux程序間通訊 管道(有名管道

2021-08-09 13:39:54 字數 1857 閱讀 6184

時隔很久,再來更博...

今天主要寫的是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...