程序間通訊(二) 管道

2022-08-28 00:48:08 字數 3350 閱讀 5173

管道分為命名管道和匿名管道,首先我們談一下命名管道。

命名管道雙向,跨網路,任何程序都可以輕易的抓住,放進管道的資料有固定的格 式,而使用readfile()只能讀取該大小的倍數。

其實管道的使用方法與檔案類似,都能使用read,write,open等普通io函式. 管道描述符來類似於檔案描述符. 事實上, 管道使用的描述符,檔案指標和檔案描述符最終都會轉化成系統中socket描述符.,都受到系統核心中socket描述符的限制.。本質上linux核心原始碼中管道是通過空檔案來實現。

server端:

#include "stdafx.h"

#include #include using namespace std;

#define named_pipe l"\\\\.\\pipe\\namedpipe"

#define buffer_size 0x1000

int main()

bool bok = connectnamedpipe(pipehandle, null);

if (bok == false)

char bufferdata[buffer_size] = ;

dword bufferlegth = 0;

while (true)

printf("please input the word!\r\n");

cin >> bufferdata;

bok = writefile(pipehandle, bufferdata, strlen(bufferdata), &bufferlegth, null); }

closehandle(pipehandle);

return 0;

}

client端:

#include "stdafx.h"

#include #include using namespace std;

#define named_pipe l"\\\\.\\pipe\\namedpipe"

#define buffer_size 0x1000

int main()

; //傳送過去的資料

dword bufferlegth = 0;

char szoutbufferdata[buffer_size] = ; //傳送過來的資料

while (true)

if (!strcmp(bufferdata,"bye"))

}return 0;

}

匿名管道與命名管道有些不同,使用限制也較多,主要在以下兩方面:

第一:匿名管道只能實現本地程序之間的通訊,不能實現跨網路之間的程序間的通訊。

第二:匿名管道只能實現父程序和子程序之間的通訊,而不能實現任意兩個本地程序之間的通訊。

例項:server端:

#include "stdafx.h"

#include #include using namespace std;

int main()

//建立子程序

startupinfo startupinfo;

process_information processinfo;

zeromemory(&startupinfo, sizeof(startupinfo));

startupinfo.cb = sizeof(startupinfo);

startupinfo.dwflags = startf_usestdhandles;

startupinfo.hstderror = getstdhandle(std_error_handle);

startupinfo.hstdinput = readhandle;

startupinfo.hstdoutput = writehandle;

if (!createprocess(l"nonamedpipeclient.exe", null, null, null, true, 0,null,null, &startupinfo, &processinfo))

else

while (true)

; dword bufferlength = 0;

zeromemory(bufferdata, sizeof(bufferdata));

if (readfile(readhandle,bufferdata,sizeof(bufferdata),&bufferlength,null))

printf("client:%s \r\n",bufferdata);

} printf("please input the word!\r\n");

zeromemory(bufferdata, sizeof(bufferdata));

cin >> bufferdata;

if (!strcmp(bufferdata, "bye"))

if (writefile(writehandle, bufferdata, sizeof(bufferdata), &bufferlength, null))

}closehandle(readhandle);

closehandle(writehandle);

return 0;

}

client端:
#include "stdafx.h"

#include #include using namespace std;

int main()

while (true)

; dword bufferlength = 0;

zeromemory(bufferdata, sizeof(bufferdata));

printf("please input the word!\r\n");

cin >> bufferdata;

if (!strcmp(bufferdata, "bye"))

writefile(writehandle, bufferdata, sizeof(bufferdata), &bufferlength, null);

zeromemory(bufferdata, sizeof(bufferdata));

if (readfile(readhandle, bufferdata, sizeof(bufferdata), &bufferlength, null))

printf("client:%s \r\n", bufferdata);

} }closehandle(readhandle);

closehandle(writehandle);

return 0;

}

程序間通訊(二)有名管道

有名管道fifo依賴於檔案系統,使得不僅僅是親緣程序,同主機任意程序間也可實現通訊。有名管道和普通檔案一樣具有磁碟存放路徑 檔案許可權和其他屬性。但是有名管道並沒有在磁碟中存放真正的資訊,他儲存的通訊資訊在記憶體中,兩個程序通訊結束後自動消失。通訊結束後,有名管道的檔案路徑本身仍然存在。api 建立...

程序間通訊 匿名管道通訊

將關於匿名管道通訊過程中遇到的問題以及心得總結一下 使用場合 匿名管道通訊對執行緒間通訊和父子程序之間的通訊非常有用 一下 分三部分 1.建立匿名管道 2.建立子程序 1 使用getstdhandle函式獲取標準輸出裝置的控制代碼 2 使用setstdhandle函式將標準輸出到寫匿名管道 3 使用...

程序間通訊方式 管道通訊

c語言中的管道通訊是通過在核心中開闢一塊空間,使用者通過檔案io介面來訪問這塊空空間實現通訊目的。管道的優點是直接訪問記憶體,通訊速度較快。缺點是一方面管道屬於半雙工的通訊,即同一程序只能讀或者寫,無法同時讀寫同一管道。另一方面管道中的資料只能讀一次,無法重複讀取。程序通過檔案io來操作管道,但是不...