?? 17.2.1 匿名管道及基礎知識.txt
字號:
17.2 匿名 管道
17.2.1 基礎知識
匿名管道是一個未命名的、單向管道,通常用來在一個父進程和一個子進程之間傳輸
。匿名管道只能實現本地機器上兩個進程間的通信,而不能實現跨網絡的通信。
為了創建匿名管道,需要調用CreatePipe函數,該函數的原型聲明如下所示:
BOOL CreatePipe(
PHANDLE hReadPipe ,
PHANDLE hWri匕ePipe,
LPSECURITY_ATTRIBUTES lpPipeAttributes ,
DWORD nSize
CreatePipe函數將創建一個匿名管道,返回該匿名管道的讀寫句柄。該函數有四個參數,其含義分別如下所述。
. hReadPipe和hWritePipe
這兩個參數都是out類型,即作為返回值來便用。前者返回管道的讀取句柄,后者接收管道的寫入句柄。也就是說,在程序中需要定義兩個句柄變量,將它們的地址分別傳遞給這兩個參數,然后CreatePipe函數將通過這兩個參數返回創建的匿名管道的讀寫句柄。
. lpPipeAtttibutes
一個指向SECURITY .πRffiUTES結構體的指針,檢測返回的句柄是否能被子進程繼承。如果此參數為 NULL,則句柄不能被繼承。在前面的章節中,凡是需要 SECURITY ATTRIBUTES結構體指針的地方,我們傳遞的都是NULL值,讓系統為創建的對象賦予默認的安全描述符,而函數所返回的句柄將不能被子進程所繼承。但在本章匿名管道的例子中,不能再為此參數傳遞NULL值了,因為匿名管道只能在父子進程之間進行通信。子進程如果想要想獲得匿名管道的句柄,只能從父進程繼承而來。當一個子進程從其父進程繼承了匿名管道的句柄后,這兩個進程就可以通過該句柄進行通信了。所以,在本章匿名管道的例子中,必須構造一個SECURIτ'Yj'>;τTRffiUTES結構體變量,該結構
體的定義如下所示:
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES , *PSECURITY_ATTRIBUTES;
SECURITY ATTRffiUTES結構體有三個成員,第一個成員(nLength)指定該結構體的大小:第二個成員 (lpSecurityDescriptor)是一個指向安全描述符的指針,在本章匿名管
道的例子中,可以給這個成員傳遞 NULL值,讓系統為創建的匿名管道賦予默認的安全描
述符:第三個成員 ( blnheritHandle )很關鍵,該成員指定所返回的句柄是否能被一個新的
進程所繼承,如果此成員為 TRUE,那么返回的句柄能夠被新進程繼承。在本章匿名管道
的例子中,需要將此成員設置為 TRUE,讓子進程可以繼承父進程創建的匿名管道的讀寫句柄。
. nSize
指定管道的緩沖區大小,該大小僅僅是一個建議值,系統將使用這個值來計算一個適當的緩沖區大小。如果此參數是 0,系統則使用默認的緩沖區大小。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -