Linux程序通訊之有名管道

2021-10-09 08:20:41 字數 1566 閱讀 4111

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嚴格遵守 先進先出 原則。讀總是從頭開始...