1、定義參照前文無名管道
2、特點:
(1)區別於無名,管道有名管道可以使互不相關的兩個程序通訊(在建立管道時,通過路徑+檔名來進行識別)
(2)建立有名管道後,程序可以將其作為檔案來進行讀寫
(3)先進先出fifo。
(4)fifo在寫入的資料的位元組數小於或者等於pipe_buf時,能夠保證write操作是原子的。即多個程序差不多同時往同乙個管道或者fifo寫資料時,不會互相混雜。 如果寫入的資料的位元組數大於pipe_buf,則不能保證原子性。
(5)fifo的真正表現子伺服器可以是乙個長期的執行程序,與客戶無親緣關係,伺服器建立乙個fifo,並開啟兩次,一次唯讀,一次只寫(不會寫資料,但是需要保證該fifo不被關閉),直到某個時間點客戶端寫入命令,讀取命令,操作。
3、函式:
#include
#include
intmkfifo
(const
char
*filename,mode_t mode)
;
引數:
filename:建立的管道,包括路徑,檔案不存可可以建立,否則直接開啟即可。可以在建立之前呼叫unlink從檔案系統中刪除
mode:
o_rdonly
o_wronly
o_rdwr讀寫
o_nonblock 非阻塞,開啟fifo 檔案來讀取的操作會立刻返回,沒有使用o_nonblock 標記時,開啟fifo 來讀取的操作會等到其他程序開啟fifo檔案來寫入才正常返回
o_creat 如果該檔案不存在 ,建立該檔案,並用第三個引數為其設定許可權
o_excl 測試檔案是否存在
錯誤**
eaccess 引數pathname所指定的目錄路徑無可執行的許可權
eexist 引數pathname所指定的檔案已存在。
enametoolong 引數pathname的路徑名稱太長。
enoent 引數pathname包含的目錄不存在
enospc 檔案系統的剩餘空間不足
enotdir 引數pathname路徑中的目錄存在但卻非真正的目錄。
erofs 引數pathname指定的檔案存在於唯讀檔案系統內。
可用perror(「mkfifo」)列印
**實現:
#include
#include
#include
#include
#include
#include
#include
#include
#define my_fifo "/media/b/myfifo"
//管道檔名
#define buff_size 100
void
fifotest()
else
;char writebuff[buff_size]=;
if(pid ==0)
}else}}
}int
main
(void
)
程序通訊之有名管道
程序通訊之有名管道 一 前言 我們前面部落格講過,父子程序之間,對於檔案操作的檔案操作符是共享的,而對於程序的全域性資料,堆區資料,棧區資料是不共享的,那麼程序之間到底是怎麼進行資訊的傳遞的呢,具體的實現,以及傳遞的過程是怎麼完成的呢,前面我們講過訊號在程序之間的使用,那也是一種程序之間資訊的傳遞。...
程序間通訊之有名管道
相對於無名管道而言,有名管道當然是有名字的,這樣就可以使任何程序通過檔名或路徑名與該管道掛鉤。所以,有名管道可用於任意兩程序之間的通訊。就有名管道和無名管道的實現來說,主要是在開啟方式上有所不同,管道檔案一旦開啟 建立 以後兩者對管道檔案的讀 寫和關閉操作相同。int open const char...
Linux程序通訊 有名管道
管道 pipe 是無名管道,他是程序資源的一部分,隨著程序的結束而消失。並且它只能在擁有公共祖先程序的程序內通訊。而有名管道 fifo 的出現則解決了這個問題。fifo提供了乙個路徑名與它關聯。這樣可以通過訪問該路徑就能使得兩個程序之間相互通訊。此處的fifo嚴格遵守 先進先出 原則。讀總是從頭開始...