Linux系統程式設計 程序間通訊 命名管道

2021-09-02 01:31:04 字數 2150 閱讀 9227

命名管道,意思就是給他指明了名字,他打破了匿名管道只能具有親緣關係之間進行通訊的缺陷,它是一種特殊的「檔案」。命名管道提供了乙個路徑名與之關聯,以 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 程序間的高階通訊方式,用於通知其他程序有...