程序間通訊(三) 利用命名管道

2021-04-30 05:31:04 字數 1487 閱讀 6553

程序間通訊(三):利用命名管道

程序間通訊的四種方式

1)剪貼簿

2)匿名管道

3)命名管道

4)郵槽

命名管道是通過網路來完成程序間的通訊,它遮蔽了底層的網路協議細節。我們在不了解網路協議的情況下,也可以利用命名管道來實現程序間的通訊。

將命名管道作為一種網路程式設計方案時,它實際上建立了乙個客戶機/伺服器通訊體系,並在其中可靠地傳輸資料。

命名管道是圍繞

windows

檔案系統設計的一種機制,採用

「命名管道檔案系統

(named pipe file system

,npfs)」

介面,因此,客戶機和伺服器可利用標準的

win32

檔案系統函式

(例如:

readfile

和writefile)

來進行資料的收發。

命名管道伺服器和客戶機的區別在於:伺服器是唯一乙個有權建立命名管道的程序,也只有它才能接受管道客戶機的連線請求。而客戶機只能同乙個現成的命名管道伺服器建立連線。

命名管道提供了兩種基本通訊模式:位元組模式和訊息模式。在位元組模式中,資料以乙個連續的位元組流的形式,在客戶機和伺服器之間流動。而在訊息模式中,客戶機和伺服器則通過一系列不連續的資料單位,進行資料的收發,每次在管道上發出了一條訊息後,它必須作為一條完整的訊息讀入。

createnamedpipe

用來建立命名管道,

connectnamedpipe

被伺服器端用來等待客戶端連線的到來,

建立命名管道以及判斷是否有連線到來的**如下:

if(invalid_handle_value==m_hpipe)

handle hevent=createevent(null,true,false,null);//

if(!hevent)

overlap.hevent=hevent; //

如果m_hpipe

是以開啟的,則必須使用

createevent

得到的控制代碼賦值給

結構體中的

hevent

if(!connectnamedpipe(m_hpipe,&overlap))

} if(wait_failed==waitforsingleobject(hevent,infinite))

closehandle(hevent);

從命名管道讀取資料**如下:

char buf[100];

dword dwread;

if(!readfile(m_hpipe,buf,100,&dwread,null))

messagebox(buf);

從命名管道寫入資料**如下:

char buf="welcome to my blog";

dword dwwrite;

if(!writefile(m_hpipe,buf,strlen(buf)+1,&dwwrite,null))

程序間通訊 命名管道

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

程序間通訊 命名管道

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

程序間通訊 命名管道

命名管道 命名管道是乙個存在於檔案系統的乙個特殊檔案,命名管道和匿名管道區別 建立命名管道 從命令列建立 mkfifo filename 在程式中建立 函式原型 int mkfifo const char filename,mode t mode 返回值 成功返回 如果檔案已經存在返回 errno為...