程序間通訊 命名管道

2021-08-31 13:22:57 字數 2012 閱讀 4925

命名管道

命名管道是乙個存在於檔案系統的乙個特殊檔案,

命名管道和匿名管道區別:

建立命名管道

從命令列建立:mkfifo filename

在程式中建立:

函式原型: int mkfifo( const char *filename, mode_t mode);

返回值:成功返回0, 如果檔案已經存在返回-1errno為eexist

引數:filename 需要建立的管道檔名 mode fifo檔案許可權

命名管道操作

命名管道建立成功後和普通檔案一樣進行操作,開啟後命名管道預設屬性是阻塞

讀寫規則:

阻塞狀態下

open() 以唯讀方式開啟 fifo 時,要阻塞到某個程序為寫而開啟此 fifo

open() 以只寫方式開啟 fifo 時,要阻塞到某個程序為讀而開啟此 fifo。

阻塞狀態下

寫端關閉後讀端讀取資料

寫端開啟讀端讀取資料

讀端關閉後寫端寫資料

讀端開啟寫端寫資料

管道無資料

返回0阻塞

收到sigpipe訊號

寫入資料返回實際寫入資料的位元組數

管道有資料

讀取資料並返回實際讀取的位元組數

讀取資料並返回實際讀取的位元組數

收到sigpipe訊號

如果管道已滿就阻塞,否則返回實際寫入資料的位元組數

非阻塞狀態下

open() 以唯讀方式開啟 fifo 時,直接返回成功

open() 以只寫方式開啟 fifo 時,返回失敗( -1 ) errno 為enxio

非阻塞狀態

寫端關閉後讀端讀取資料

寫端開啟讀端讀取資料

讀端關閉後寫端寫資料

讀端開啟寫端寫資料

管道無資料

返回0返回-1 errno 為eagain

收到sigpipe訊號

寫入資料返回實際寫入資料的位元組數

管道有資料

讀取資料並返回實際讀取的位元組數

讀取資料並返回實際讀取的位元組數

收到sigpipe訊號

如果管道已滿直接返回0,否則返回實際寫入資料的位元組數

用命名管道實現檔案的拷貝

從text檔案讀取資料寫入管道

#include

#include

#include

#include

#include

#include

#define err_exit(m) \

do \

while(0)

intmain()

;int num;

while

((num =

read

(infd, buff,

1023))

>0)

close

(infd)

;close

(outfd)

;return0;

}

從管道讀取資料寫入檔案text.ba中

#include

#include

#include

#include

#include

#include

#define err_exit(m) \

do \

while(0)

intmain()

;int num;

while

((num =

read

(infd, buff,

1023))

>0)

close

(outfd)

;close

(infd)

;return0;

}

程序間通訊 命名管道

程序間通訊的本質是不同的程序看到了同乙份公共的資源。而管道的 乙個不 足之處是沒有名字,因此,只能 用於具有親緣關係的程序間通訊,在命名管道 named pipe或fifo 提出後,該限制得到了克服。fifo不同於管道之處在於它提供 乙個路徑名與之關聯,以fifo的 檔案形式儲存於 檔案系統中。命名...

程序間通訊 命名管道

命名管道,和匿名管道,有了自己的名字,有了名字就可以操作。所以他不在侷限於有血緣關係的兩個程序之間,適用於任意的兩個程序。實際上和匿名管道一樣是一塊核心中的快取,和匿名管道不一樣的是,他在檔案系統中多了檔案,而匿名管道的檔案只存在與記憶體中,但是命名管道的檔案雖然存在,有在核心資料結構中有自己的環境...

程序間通訊 命名管道

規定建立命名管道的程式是服務端 本程式服務端負責接收資料並列印 include include bool server dword dwread 0 建立雙向管道 handle hpipe createnamedpipea pipe hambaga pipe access duplex,pipe t...