命名管道,意思就是給他指明了名字,他打破了匿名管道只能具有親緣關係之間進行通訊的缺陷,它是一種特殊的「檔案」。命名管道提供了乙個路徑名與之關聯,以 fifo 的檔案形式存在於檔案系統中,所以當兩個不具有親緣關係程序要通訊時,只需要訪問路徑名即可。
1、fifo 在檔案系統中作為乙個特殊的檔案而存在,但 fifo 中的內容卻存放在記憶體中。
2、當使用 fifo 的程序退出後,fifo 檔案將繼續儲存在檔案系統中以便以後使用。
3、fifo 有名字,不相關的程序可以通過開啟命名管道進行通訊。
1.匿名管道由pipe函式建立並開啟
2.命名管道由mkfifo建立,開啟用open
1.命令列建立命名管道
$ mkfifo filename
2.函式建立
//所需標頭檔案:
#include
#include
intmkfifo
(const
char
*pathname, mode_t mode)
;引數:pathname: 普通的路徑名,也就是建立後 fifo 的名字。
mode: 檔案的許可權,與開啟普通檔案的 open
() 函式中的 mode 引數相同,
返回值:成功:0 失敗:如果檔案已經存在,則會出錯且返回 -
1。
1.如果當前開啟操作是為唯讀而開啟fifo時:o_nonblock disable(阻塞):阻塞直到有相應程序為寫而開啟該ffo
o_nonblock enable(非阻塞):立刻返回成功
2.如果當前開啟操作是為只寫而開啟fifo時:
o_nonblock disable(阻塞):阻塞直到有相應程序為讀而開啟該ffo
o_nonblock enable(非阻塞):立刻返回失敗-1,errno錯誤碼為 enxio
3.如果不想在 open() 的時候阻塞,我們可以可讀可寫方式開啟 fifo 檔案,這樣 open() 函式就不會阻塞。
4.通訊過程中,讀程序退出後,寫程序向命名管道內寫資料時,寫程序會收到 sigpipe 訊號退出(同匿名管道)。
5.通訊過程中若寫程序先退出了,就算命名管道裡沒有資料,呼叫 read() 函式從 fifo 裡讀資料時不阻塞;若寫程序又重新執行,則呼叫 read() 函式從 fifo 裡讀資料時又恢復阻塞。
接下來,我們利用命名管道實現server和client之間的通訊
serverpipe.c
#include
#include
#include
#include
#include
#include
intmain()
int rfd =
open
("mypipe"
, o_rdonly);if
(rfd <0)
char buf[
1024];
while(1
)else
if(s ==0)
else
}close
(rfd)
;return0;
}
clientpipe.c
#include
#include
#include
#include
#include
#include
#include
intmain()
char buf[
1024];
while(1
)else
if(s ==0)
}close
(wfd)
;return0;
}
執行結果:
客戶端:
服務端:
linux系統程式設計 程序間通訊 pipe
程序間通訊 pipe 每個程序各自有不同的使用者位址空間,任何乙個程序的全域性變數在另乙個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊 ipc,interproce...
Linux系統程式設計 程序間通訊 IPC
利用檔案進行程序間通訊的程式示例 include include include include include include intmain if pid 0 write fd1,str,strlen str printf child wrote over n if pid 0 sleep 1 ...
Linux系統程式設計 程序間通訊(一)
linux系統主要的程序間通訊機制如下 無名管道 pipe 及命名管道 named pipe 無名管道可用於具有父子關係程序間的通訊 命名管道用於無父子關係的程序之間的通訊。無父子關係的程序可將資訊傳送到某個命名管道中,通過管道名讀取資訊 訊號 signal 程序間的高階通訊方式,用於通知其他程序有...