一、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的定義 需要明確的是,雖然管道在理論上是雙向的,但...