我們接著簡紹2種程序間通訊的方法:
3.命名管道:
命名管道可以再2個任意程序間通訊(包括網路上的2個不同主機之上的程序) 他們建立了如客戶機/伺服器的連線
建立命名通道的機器為伺服器 連線命名通道的機器為客戶機
在命名管道的使用中 我們會使用事件物件來標識管道的連線和讀寫操作
下面是要用到的函式:(有關詳細簡紹可以看msdn)
這個函式用來建立乙個命名管道 失敗則返回invalid_handle_value 成功返回管道控制代碼
handle createnamedpipe(
lpctstr lpname, // pipe name
dword dwopenmode, // pipe open mode
dword dwpipemode, // pipe-specific modes//
dword nmaxinstances, // maximum number of instances
dword noutbuffersize, // output buffer size
dword ninbuffersize, // input buffer size
dword ndefaulttimeout, // time-out interval
lpsecurity_attributes lpsecurityattributes // sd
);這個函式用來連線命名管道(客戶機使用)
bool waitnamedpipe(
lpctstr lpnamedpipename, // pipe name
dword ntimeout // time-out interval
);大致流程如下:
connectnamedpipe等待連線------->呼叫waitforsingleobject函式等待事件物件發生
handle hevent;
hevent=createevent(null,true,false,null);
if (!hevent)
-----------------------------------------客戶機連線到命名管道
if(!waitnamedpipe(".//pipe//mypipe",nmpwait_use_default_wait))
hpipe=createfile(".//pipe//mypipe",
generic_read|generic_write,0,null,open_existing,file_attribute_normal,null);
if ( invalid_handle_value==hpipe)
--------------------------------------------讀檔案
char buf[100];
dword dwread;//實際讀取資料數目
//讀取資料
if (!readfile(hpipe,buf,100,&dwread,null))
messagebox(buf);
---------------------------------------------寫檔案
char buf="客戶端寫入資料";
dword dwwrite;//實際寫入的資料量
//寫入資料
if (!writefile(hpipe,buf,strlen(buf)+1,&dwwrite,null))
4.油槽
也可以像命名管道一樣用於任意程序間通訊 但要注意的是 油槽的建立者程序只能從油槽中讀取資料 使用者程序只能寫入資料
如果要實現雙向通訊 只需要建立2個油槽 油槽是基於廣播通訊的 這樣我們可以用很少的**實現廣播 實現1對多的單向通訊 才用socket編碼則較為複雜 缺點是傳送資料量較
少 訊息大小為424位元組以下
油槽建立比較簡單,下面是源**:
建立油槽 建立者進城 讀取資料
handle hmailslot;
hmailslot=createmailslot(".//mailslot//mymalislot",
0,mailslot_wait_forever,null);
if (invalid_handle_value==hmailslot)
char buf[100];
dword dwread;//實際讀取資料數目
//讀取資料
if (!readfile(hmailslot,buf,100,&dwread,null))
messagebox(buf);
closehandle(hmailslot);
//使用者程序 寫入資料
handle hmailslot;
hmailslot=createfile(".//mailslot//mymalislot",generic_write,
file_share_read,null,open_existing,file_attribute_normal,null);
if (hmailslot==invalid_handle_value)
char buf="油槽寫入資料";
dword dwwrite;//實際寫入的資料量
//寫入資料
if (!writefile(hmailslot,buf,strlen(buf)+1,&dwwrite,null))
createfile writefile readfile可以用來建立,讀取檔案 也能用來建立,讀取油槽 命名管道等 見msdn
命名管道和油槽
我們接著簡紹2種程序間通訊的方法 3.命名管道 命名管道可以再2個任意程序間通訊 包括網路上的2個不同主機之上的程序 他們建立了如客戶機 伺服器的連線 建立命名通道的機器為伺服器 連線命名通道的機器為客戶機 在命名管道的使用中 我們會使用事件物件來標識管道的連線和讀寫操作 下面是要用到的函式 有關詳...
普通管道和命名管道
2116 0 管道分為普通管道和命名管道 兩者都是半雙工的。普通管道只能用於父子程序或兄弟程序間的通訊,因為普通管道通過fork呼叫來拷貝檔案描述符的,在檔案系統中,普通管道並不對應物理檔案。命名管道在檔案系統中有物理檔案存在,因此可以用於非親屬的程序間通訊。include int pipe int...
命名管道和匿名管道
我們知道程序間是可以通訊的。可以達到資料傳輸 資源共享 事件通知 程序控制等目的。程序間通訊主要包括管道 系統ipc,套接字等。管道分為三種 1 普通管道 int pipe int fds 2 返回值0表示成功,1表示失敗 fd 0 讀 fd 1 寫 子程序往管道中寫資料,寫資料時要關閉讀端 父程序...