匿名管道 程序間的通訊

2021-05-22 00:16:26 字數 3751 閱讀 7270

匿名管道

匿名管道是一種未命名的、單向管道,通常用來在乙個父程序和乙個子程序之間傳輸資料。匿名的管道只能實現本地機器上兩個程序間的通訊,而不能實現跨網路的通訊。

1.1匿名管道

匿名管道是一種未命名的、單向管道。通常用來在父程序和子程序之間傳輸資料。匿名管道總是本地的,不能在網路之間傳遞資料。

1.1.1匿名管道操作

通過一下幾個方法,管道服務端控制管道控制代碼是否可以被繼承:

一、呼叫createpipe時,將security_attributes引數的成員binherithandle設為true,那麼這個createpipe建立的管道就可以被繼承。

二、管道服務端可以利用duplicatehandle函式改變管道控制代碼的繼承特性。管道服務到可以從可繼承的管道控制代碼複製出不可繼承的控制代碼,也可以從不可繼承的管道控制代碼複製出可繼承的控制代碼。

三、createprocess函式使得管道服務端可以決定子程序是否繼承自己的所有控制代碼。

在同乙個目錄下面建立兩個不同的工程parent和child:

·@父程序的實現

1.新增兩個私有成員變數

// attributes

private:

handle hwrite;

handle hread;

初始化為null

cparentview::cparentview()

// todo: add construction code here

hwrite = null;

hread = null;

在析構函式中關閉這兩個變數。

cparentview::~cparentview()

if(hread)

closehandle(hread);

if(hwrite)

closehandle(hwrite);

2.匿名管道的建立

void cparentview::onpipecreate()

// todo: add your command handler code here

security_attributes sa;

sa.binherithandle = true;

sa.lpsecuritydescriptor = null;

sa.nlength = sizeof(security_attributes);

if(!createpipe(&hread,&hwrite,&sa,0))

messagebox("建立匿名管道失敗!");

return;

startupinfo sui;

process_information pi;

zeromemory(&sui,sizeof(startupinfo));

sui.cb = sizeof(startupinfo);

sui.dwflags = startf_usestdhandles;

sui.hstdinput = hread;

sui.hstdoutput = hwrite;

sui.hstderror = getstdhandle(std_error_handle);

//if(!createprocess("..//child//debug//child.exe",null,null,null,

if(!createprocess("..//parent//debug//child.exe",null,null,null,

true,0,null,null,&sui,&pi))

closehandle(hread);

closehandle(hwrite);

hread = null;

hwrite = null;

messagebox("建立子程序失敗!");

return;

else

closehandle(pi.hprocess);

closehandle(pi.hthread);

3.匿名管道的讀取操作

void cparentview::onpiperead()

// todo: add your command handler code here

char buf[100];

dword dwread;

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

messagebox("讀取資料失敗!");

return ;

messagebox(buf);

4.匿名管道的寫入操作

messagebox("寫入資料失敗!");

return ;

·@子程序的實現

1. // attributes

private:

handle hwrite;

handle hread;

cchildview::cchildview()

// todo: add construction code here

hread = null;

hwrite = null;

cchildview::~cchildview()

if(hread)

closehandle(hread);

if(hwrite)

closehandle(hwrite);

2.獲取管道的讀取和寫入控制代碼

void cchildview::oninitialupdate()

cview::oninitialupdate();

// todo: add your specialized code here and/or call the base class

hread = getstdhandle(std_input_handle);

hwrite = getstdhandle(std_output_handle);

3.讀取資料

void cchildview::onpiperead()

// todo: add your command handler code here

char buf[100];

dword dwread;

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

messagebox("讀取資料失敗!");

return ;

messagebox(buf);

4.寫入資料

void cchildview::onpipewrite()

// todo: add your command handler code here

char buf = "匿名管道測試程式";

dword dwwrite;

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

messagebox("寫入資料失敗!");

return ;

利用匿名管道實現父子程序間通訊時,需要注意一點:因為匿名管道沒有名稱,所以只能在父程序中呼叫createprocess函式建立子程序時,將管道的讀、寫控制代碼傳遞給子程序。

程序間通訊 匿名管道

最近實現乙個遠端超級終端的功能,通訊模式是這樣的 客戶端 通過網路傳送cmd命令到 伺服器端 通過程序間通訊 管道 將此cmd命令發給 cmd.exe程式,cmd.exe執行此cmd命令 接下來 cmd.exe 程式將執行結果返回 伺服器端 傳送此次結果到 客戶端,客戶端對結果進行顯示 其中伺服器端...

程序間通訊 匿名管道

1.程序通訊的目的 1 資料傳輸 乙個程序需要將它的資料傳輸給另乙個程序 2 資源共享 多個程序之間共享同樣的資源 3 通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了什麼事情 2.管道 管道是一種程序之間通訊的一種方式,我們把從乙個程序連線到另乙個程序的資料流叫做管道 3.匿名管道...

程序間通訊 匿名管道

使用匿名管道做程序通訊,需要用父程序建立乙個子程序,該子程序的標準輸入輸出控制代碼由父程序指定。無論父程序還是子程序,都可以收發資料,這裡僅演示父程序發資料,子程序列印資料。父程序迴圈從控制台讀資料,並傳送給子程序,子程序用對話方塊列印資料,約定子程序收到 quit 後退出。define crt s...