IPC實現機制(二) 命名管道(FIFO)

2021-08-02 09:35:52 字數 2003 閱讀 2717

一、fifo的概念:

匿名管道(pipe)的⼀個不⾜之處是沒有名字,因此,只能⽤於具有親緣關係的程序間通訊;

因此,提出了命名管道;命名管道(fifo) 提供⼀個路徑名與之關聯,以fifo的⽂件形式儲存於⽂件系統中。

命名管道是⼀個裝置⽂件,因此,即使程序與建立fifo的程序不存在親緣關係,只要可以訪問該路徑,就能夠通過fifo相互通訊。

值得注意的是, fifo(first input first output)總是按照先進先出的原則⼯作,第⼀個被寫⼊的資料將⾸先從管道中讀出。

二、fifo的建立和讀寫:

(1)指令建立命名管道:mknod或mkfifo命令

格式:mknod namedpipe

(2)呼叫系統函式建立命名管道:

#include 

#include

int mkfifo( const

char *pathname, mode_t mode);

功能:

命名管道的建立。

引數:pathname:普通的路徑名,也就是建立後 fifo 的名字。

返回值:

成功:0

失敗:如果檔案已經存在,則會出錯且返回 -1。

後期的操作,把這個命名管道當做普通檔案一樣進行操作:open()、write()、read()、close()。但是,和無名管道一樣,操作命名管道肯定要考慮預設情況下其阻塞特性。

(3)開啟命名管道

int fd = open( char name , int how);

name表示檔名字串,

而how指定開啟的模式

o_rdonly(唯讀),

o_wronly(只寫),

o_rdwr (可讀可寫),

成功返回乙個正整數稱為檔案描述符

失敗的話返回-1

調⽤open()開啟命名管道的程序可能會被阻塞。

如果同時⽤讀寫⽅式(o_rdwr)開啟,則⼀定不會導致阻塞;

如果以唯讀⽅式(o_rdonly)開啟,則調⽤open()函式的程序將會被阻塞直到有寫⽅開啟管道;

同樣以寫⽅式(o_wronly)開啟

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

後兩種阻塞總結為:唯讀等著只寫,只寫等著唯讀,只有兩個都執行到,才會往下執行。

(4)乙個簡單的命名管道的例子:

結果:

1.單向通訊;

2.不侷限於只有親緣關係的程序間通訊;命名管道是⼀個裝置⽂件,存在於記憶體中,只要可以訪問該路徑,就能夠通過fifo相互通訊。

3.生命週期—隨核心(一直存在,直到使用者自己刪除);

4.命名管道對上層提供的服務叫流服務(面向位元組流),與傳輸格式無關係;

5.命名管道自帶同步機制;

命名管道(fifo)和無名管道(pipe)有一些特點是相同的,不一樣的地方在於:

1、fifo 在檔案系統中作為乙個特殊的檔案而存在,但 fifo 中的內容卻存放在記憶體中。

2、當使用 fifo 的程序退出後,fifo 檔案將繼續儲存在檔案系統中以便以後使用。

3、fifo 有名字,不相關的程序可以通過開啟命名管道進行通訊。

IPC之命名管道

1.管道是通過io介面訪問得位元組流,windows中利用得是readfile 和writefile windows利用單一控制代碼支援雙向io,命名管道也稱做fifo first in first out 命名管道得機制 乙個程序把資料放到管道裡,另乙個知道管道名字得程序把資料把取走,實際是用於程...

IPC機制和實現

1 管道 pipe 管道可用於具有親緣關係程序間的通訊,允許乙個程序和另乙個與它有共同祖先的程序之間進行通訊。2 命名管道 named pipe 命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊。命名管道在檔案系統中有對應的檔名。命名管道通過命令mkf...

Linux下的IPC 命名管道的使用

程序之間通過管道來進行通訊是一種常用的方法,顧名思義,管道就是一端進 寫 一端出 讀 的fifo佇列,這個佇列由核心管理,有一定大小 一般是4k 有文章上提到,如果需要修改該快取區,需要重新編譯核心 修改linux limits.h裡pipe buf的定義 需要明確的是,雖然管道在理論上是雙向的,但...