管道分為命名管道和匿名管道,首先我們談一下命名管道。
命名管道雙向,跨網路,任何程序都可以輕易的抓住,放進管道的資料有固定的格 式,而使用readfile()只能讀取該大小的倍數。
其實管道的使用方法與檔案類似,都能使用read,write,open等普通io函式. 管道描述符來類似於檔案描述符. 事實上, 管道使用的描述符,檔案指標和檔案描述符最終都會轉化成系統中socket描述符.,都受到系統核心中socket描述符的限制.。本質上linux核心原始碼中管道是通過空檔案來實現。
server端:
#include "stdafx.h"client端:#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;
}
#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"client端:#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;
}
#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來操作管道,但是不...