程序間通訊(2) 命名管道

2021-08-03 16:57:02 字數 2007 閱讀 3920

命名管道的應用,正是為了克服匿名管道存在的這些缺陷。命名管道可以在沒有親緣關係的程序中應用,甚至在不同計算上的兩個程序也可以通過命名管道實現通訊,這是因為命名管道實際上是windows在網路介面上封裝的程序間通訊形式。命名管道可以實現一對多的通訊,同時也能實現雙向讀寫通訊。

結合例子進行講解,例程如下。首先說伺服器端。命名管道伺服器端負責建立命名管道通訊,首先通過createnamedpipe函式建立管道檔案,檔名作為其他程式索引此管道檔案的唯一標識,如果在不同計算機上,可用網路標識代替「.」。建立網路成功後,通過connectnamedpipe函式在阻塞狀態等待客戶端鏈結。當客戶端程式鏈結成功後,就可以通過readfile和writefile函式讀寫管道緩衝區了。顯而易見,要首先啟動伺服器端程式。

伺服器端**:

// namedpipesrv.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include#includeusing namespace std;

int main()

else

cout << "connection success!" << endl;

if (!readfile(hpipe, buf, 256, &rlen, null)) //接受客戶端傳送資料

else

cout << "from client: data = " << buf << endl << "size = " << rlen << endl;

char strmessage = "server recived ezhchai!";

writefile(hpipe, strmessage, sizeof(strmessage), &wlen, 0); //向客戶端傳送資料

closehandle(hpipe); //關閉管道控制代碼

} system("pause");

return 0;

}

在客戶端程式中,通過waitnamedpipe函式等待管道建立成功,通過createfile函式連線到管道檔案,當鏈結成功後,就和伺服器端一樣,通過readfile和writefile函式讀寫管道緩衝區了。

客戶端**:

// namedpipeclt.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include#includeusing namespace std;

int main()

handle hpipe = createfile( //建立管道檔案,即鏈結管道

text("\\\\.\\pipe\\pipetest"), //管道名稱

generic_read | generic_write, //檔案模式

0, //是否共享

null, //指向乙個security_attributes結構的指標

open_existing, //建立引數

file_attribute_normal, //檔案屬性,normal為預設屬性

null); //模板建立檔案的控制代碼

if (invalid_handle_value == hpipe)

char strmessage = "send ezhchai!";

if (!writefile(hpipe, strmessage, sizeof(strmessage), &wlen, 0)) //向管道傳送資料

if (!readfile(hpipe, buf, 256, &rlen, null)) //讀取管道資料

else

cout << "from server: data = " << buf << endl << "size =" << rlen <

程序間通訊 命名管道

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

程序間通訊 命名管道

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

程序間通訊 命名管道

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