BOOL CreatePipe(PHANDLE hReadPipe, // 指向讀句柄的指針
PHANDLE hWritePipe, // 指向寫句柄的指針
LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全屬性的指針
DWORD nSize // 管道大小);web
管道(Pipe)實際是用於進程間通訊的一段共享內存,建立管道的進程稱爲管道server,鏈接到一個管道的進程爲管道客戶機。一個進程在向管道寫入數據後,還有一進程就可以從管道的還有一端將其讀取出來。匿名管道(Anonymous Pipes)是在父進程和子進程間單向數據傳輸的一種未命名的管道,僅僅能在本地計算機中使用,而不可用於網絡間的通訊。安全
管道server將lpPipeAttributes 指向的SECURITY_ATTRIBUTES數據結構的數據成員bInheritHandle設置爲TRUE,那麼CreatePipe()建立的管道讀、寫句柄將會被繼承網絡
父進程可以調用進程建立函數CreateProcess()生成子進程。假設父進程要發送數據到子進程,父進程可調用WriteFile()將數據寫入到管道(傳遞管道寫句柄給函數),子進程則調用GetStdHandle()取得管道的讀句柄,將該句柄傳入ReadFile()後從管道讀取數據。
假設是父進程從子進程讀取數據,那麼由子進程調用GetStdHandle()取得管道的寫入句柄,並調用WriteFile()將數據寫入到管道。而後,父進程調用ReadFile()從管道讀取出數據(傳遞管道讀句柄給函數)。
在用WriteFile()函數向管道寫入數據時,僅僅有在向管道寫完指定字節的數據後或是在有發生錯誤時函數纔會返回。如管道緩衝已滿而數據尚未寫完,WriteFile()將要等到還有一進程對管道中數據讀取以釋放出不少其它可用空間後才能夠返回。管道server在調用CreatePipe()建立管道時以參數nSize對管道的緩衝大小做了設定。
匿名管道並不支持異步讀、寫操做,這也就意味着不能在匿名管道中使用ReadFileEx()和WriteFileEx(),而且ReadFile()和WriteFile()中的lpOverLapped參數也將被忽略。匿名管道將在讀、寫句柄都被關閉後退出,也可以在進程中調用CloseHandle()函數來關閉此句柄。