Linux程序間通訊 命名管道

2021-07-16 05:15:41 字數 2458 閱讀 8441

ipc

命名管道

一、原理:

管道的乙個不足之處是沒有名字,因此,只能用於具有親緣關係的程序間通訊,在命名管道(

named pip

或fifo

)提出後,該限制得到了克服。

fifo

不同於管道之處

在於它提供乙個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中

。命名管道是乙個裝置檔案,因此,即使程序與建立

fifo

的程序不存在親緣關係,只要可以訪問該路徑,就能夠通過

fifo

相互通訊。

值得注意的是,

fifo(first input first output)

總是按照先進先出的原則工作,第乙個被寫入的資料將首先從管道中讀出。

二、命名管道的建立與讀寫

linux

下有兩種方式建立命名管道。一是在

shell

下互動地建立乙個命名管道,二是在程式中使用系統函式建立命名管道。

shell

方式下可使用

mknod

或mkfifo

命令,下面命令使用

mknod

建立了乙個命名管道:

mknod namedpipe
建立命名管道的系統函式有兩個:

mknod

和mkfifo

。兩個函式均定義在頭⽂檔案

sys/stat.h,

函式原型如下:

#include #include int mknod(const char *path,mode_t mod,dev_t dev);

int mkfifo(const char *path,mode_t mode);

函式mknod

引數中path

為建立的命名管道的全路徑名:

mod為建立的命名管道的模式,指明其訪問許可權;

dev為裝置值,該值取決於檔案建立的種類,它只在建立裝置檔案時才會用到。這兩個函式呼叫成功都返回

0,失敗都返回-1。

三、例項

用mkfifo建立命名管道:

其中_path_是檔案路徑名的巨集定義:如下:

「s_ififo|0666」指明建立乙個命名管道且訪問許可權為0666,即建立者、與建立者同組的使用者、其他使用者對該命名管道的訪問許可權都是可讀可寫。

命名管道建立後就可以使用了,命名管道和管道的使用方法基本是相同的。只是使用命名管道時,必須用

open()

將其開啟。因為命名管道是乙個存在於硬碟上的檔案,而管道是存在於記憶體中的特殊檔案。

需要注意的是,呼叫

open()

開啟命名管道的程序可能會被阻塞。但如果同時用讀寫方式

(o_rdwr

)開啟,則一定不會導致阻塞;如果以唯讀方式(

o_rdonly

)開啟,則呼叫

open()

函式的程序將會被阻塞直到有寫方開啟管道;同樣以寫方式(

o_wronly

)開啟也會阻塞直到有讀方式開啟管道。

四:結束

檔案系統中的路徑名是全域性的,各程序都可以訪問,因此可以用檔案系統中的路徑名來標識乙個ipc通道。 命名管道也被稱為fifo檔案,它是一種特殊型別的檔案,它在檔案系統中以檔名的形式存在,但是它的行為卻和之前所講的沒有名字的管道(匿名管道)類似。

由於linux中所有的事物都可被視為檔案,所以對命名管道的使用也就變得與檔案操作非常的統一,也使它的使用非常方便,同時我們也可以像平常的檔名一樣在命令中使用。

五、命名管道的安全問題

前面的例子兩個程序之間的通訊問題,也就是說,乙個程序向fifo檔案寫資料,而另乙個程序則在fifo檔案中讀取資料。試想這樣乙個問題,只使用乙個fifo檔案,如果有多個程序同時向同乙個fifo檔案寫資料,而只有乙個讀fifo程序在同乙個fifo檔案中讀取資料時,會發生怎麼樣的情況呢,會發生資料塊的相互交錯是很正常的?而且個人認為多個不同程序向乙個fifo讀程序傳送資料是很普通的情況。

為了解決這一問題,就是讓寫操作的原子化。怎樣才能使寫操作原子化呢?答案很簡單,系統規定:在乙個以o_wronly(即阻塞方式)開啟的fifo中, 如果寫入的資料長度小於等待pipe_buf,那麼或者寫入全部位元組,或者乙個位元組都不寫入。如果所有的寫請求都是發往乙個阻塞的fifo的,並且每個寫記請求的資料長度小於等於pipe_buf位元組,系統就可以確保資料決不會交錯在一起。

賜教!

linux程序間通訊(命名管道)

在處理程序間通訊的問題時,匿名管道只能在有親緣關係的程序中進行通訊。如何做到在任意兩個程序之間通訊,這就要用到命名管道。命名管道也被稱為fifo檔案,它是一種特殊型別的檔案,在檔案系統中以檔案的形式存在,它的行為和匿名管道類似。可以使用mkfifo函式來建立乙個命名管道。int mkfifo con...

linux程序間通訊 命名管道

命名管道也被稱為fifo檔案,它是一種特殊型別的檔案,它在檔案系統中以檔名的形式存在,但是它的行為卻和之前所講的沒有名字的管道 匿名管道 類似。有名管道是有名有形的,為了使用這種管道linux中設立了乙個專門的特殊檔案系統 管道檔案,它存在於檔案系統中,任何程序可以在任何時候通過有名管道的路徑和檔案...

Linux程序間通訊 命名管道

我們知道,匿名管道只能用於父子關係的程序之間。那麼沒有這種關係的程序之間該如何進行資料傳遞呢?1.什麼是命名管道 匿名管道是在快取中開闢的輸出和輸入檔案流的空間,只能用於父子關係的程序之間。因為父子程序的輸入和輸出檔案描述符是一致的。命名管道是一種實際存在的fifo檔案,稱作 管道檔案 用於不同程序...