程序間的通訊 郵槽與命名管道

2021-07-02 01:55:58 字數 3328 閱讀 2135

程序間的通訊是指在系統中兩個或多個程序之間通過第三方進行資料共享。

1.郵槽.

郵槽是window系統提供的一種單向通訊的機制。即程序中的一方只能寫入或者讀取資料,而另一方則只能讀取或寫入資料。通過郵槽,可以實現一對多或跨網路的程序之間的通訊。但郵槽傳輸的資料量非常小,一般只有400kb左右。

郵槽建立函式createmailslot,函式原型:

handle createmailslot(

lpctstr lpname, // mailslot name

dword nmaxmessagesize, // maximum message size

dword lreadtimeout, // read time-out interval

lpsecurity_attributes lpsecurityattributes // inheritance option);

引數lpname表示郵槽的名稱。郵槽名稱格式為

「\\.\mailslot\name」

。其中,name表示郵槽的名稱。在vc中,格式為

「\\\\.\mailslot\name」

,如果在不同的主機上執行,則將

「.」換成對方主機名稱。

引數nmaxmessagesize指定通過郵槽傳送或者接收的訊息大小的最大值。一般設定為0,表示訊息的大小為任意值。

引數lreadtimeout表示程式讀取操作的超過時間。如果該引數為0,則當郵槽中沒有任何訊息,該函式立即返回。如果該引數為mailslot_wait_forever,表示永遠等待,直到有訊息。

引數lpsecurityattributes是結構體security_attributes的指標,表示郵槽的安全屬性。一般為null,表示預設安全屬性。

通過函式readfile()和函式writefile()進行讀寫操作。

下面是c語言實現的**:

」服務端「:

#include #include int main()

else

else

}closehandle(mail);

sleep(1000);

return 0;

}

」客戶端「:

#include #include int main()

else

else

closehandle(mail);

} sleep(1000);

return 0;

}

測試樣例:

2.命名管道.

命名管道傳輸資料是採取基於連線並且可靠的傳輸方式,所以命名管道傳輸資料只能一對一進行傳輸。

命名管道的建立函式為createnamepipe();

函式原型為:

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);

引數lpname表示建立的命名管道名稱。一般為「\\\\.\\pipe\\pipename」。

引數dwopenmode表示命名管道的開啟模式,包括訪問模式、管道控制代碼的安全訪問模式以及重疊方式。

引數dwpipemode表示控制代碼管道的型別、讀取以及等待方式。

引數nmaxinstance表示管道能夠建立例項的最大數目。

引數noutbuffersize表示輸出緩衝區的大小。

引數ninbuffersize表示輸入緩衝區的大小。

引數ndefaulttimeout表示超時值,使用同一管道不同例項必須將該引數取同樣的超時值。

引數lpsecurityattributes是指向結構體security_attributes的指標,表示命名管道的安全屬性。

連線命名管道用函式connectnamedpipe()等待客戶端的連線請求。

函式原型:

bool connectnamedpipe(  handle hnamedpipe,          // handle to named pipe
用函式waitnamedpipe()判斷伺服器建立的命名管道是否可用。

函式原型;

bool waitnamedpipe(  lpctstr lpnamedpipename,  // pipe name

dword ntimeout // time-out interval);

下面是c語言實現的例子:

服務端:

#include #include int main()

else

}return 0;

}

客戶端:

#include #include int main()

else

else

}} else

printf("連線命名管道失敗!\r\n");

return 0;

}

測試樣例:

程序間通訊 命名管道

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

程序間通訊 命名管道

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

程序間通訊 命名管道

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