共用方式為


命名管道類型、讀取和等候模式

管道伺服器會在 createNamedPi pe 函式的 dwPipeMode 參數中指定管道類型模式、讀取模式和等候模式。 管道用戶端可以使用 CreateFile 函式,為管道控點指定這些管道模式。

類型模式

管道的類型模式會決定如何將數據寫入命名管道。 數據可以透過命名管道以位元組資料流或訊息資料流的形式傳輸。 管道伺服器會在呼叫 CreateNamedPipe 時指定管道類型,以建立命名管道的實例。 管道的所有實例類型模式都必須相同。

若要建立位元組類型管道,請指定PIPE_TYPE_BYTE或使用預設值。 數據會以位元組數據流的形式寫入管道,而且系統不會區分以不同寫入作業寫入的位元組。

若要建立訊息類型管道,請指定PIPE_TYPE_MESSAGE。 系統會將每個寫入作業中寫入的位元組視為訊息單位。 系統一律會在訊息類型管道上執行寫入作業,就像已啟用寫入模式一樣。

讀取模式

管道的讀取模式會決定如何從命名管道讀取數據。 當呼叫 createNamedPipe 時,管道伺服器會指定管道句柄的初始讀取模式。 數據可以在位元組讀取模式或訊息讀取模式中讀取。 位元組類型管道的句柄只能處於位元組讀取模式。 訊息類型管道的句柄可以處於位元組讀取或訊息讀取模式。 對於訊息類型管道,伺服器和用戶端句柄的讀取模式可能會與相同的管道實例不同。

若要以位元組讀取模式建立管道句柄,請指定PIPE_READMODE_BYTE或使用預設值。 數據會以位元組數據流的形式從管道讀取。 讀取作業會在管道中的所有可用位元組讀取或讀取指定的位元組數目時順利完成。

若要在訊息讀取模式中建立管道句柄,請指定PIPE_READMODE_MESSAGE。 數據會以訊息數據流的形式從管道讀取。 只有在讀取整個訊息時,讀取作業才會順利完成。 如果所要讀取的位元組數目小於下一個訊息的大小,則函式會在傳回零之前讀取盡可能多的訊息(GetLastError 函式傳回ERROR_MORE_DATA)。 其餘的訊息可以使用另一個讀取作業來讀取。

對於管道用戶端,CreateFile 所傳回的管道句柄一開始一律處於位元組讀取模式。 管道用戶端和管道伺服器都可以使用 SetNamedPipeHandleState 函式來變更管道句柄的讀取模式。 管道控點必須具有FILE_WRITE_ATTRIBUTES訪問許可權。

等候模式

管道句柄的等候模式會決定 readFile WriteFile,以及 ConnectNamedPipe 函式如何處理冗長的作業。 在封鎖等候模式中,函式會無限期地等候管道另一端的進程來完成作業。 在非封鎖等候模式中,函式會在需要無限期等候的情況下立即傳回。

ReadFile 作業會受到管線句柄空白時的等候模式影響。 使用封鎖等候句柄時,除非數據從線程寫入至管道的另一端,否則作業不會順利完成。 使用非封鎖等候句柄,函式會立即傳回零,而 getLastError函式會傳回ERROR_NO_DATA。

當管道緩衝區空間不足時,WriteFile 作業會受到管道句柄等候模式的影響。 使用封鎖等候句柄,寫入作業將無法成功,直到從管道另一端讀取線程在緩衝區中建立足夠的空間為止。 使用非封鎖等候句柄時,寫入作業會立即傳回非零值,而不會寫入任何位元組(針對訊息類型管道),或在寫入緩衝區保留的位元元組數(針對位元組類型管道) 之後。

ConnectNamedPipe 作業會受到管道句柄的等候模式影響,當沒有任何用戶端連線或等候連線到管道實例時。 使用封鎖等候句柄時,除非管道用戶端藉由呼叫 createFileCallNamedPipe 函式來連線至管道實例,否則連線作業不會成功。 使用非封鎖等候句柄時,連接作業會立即傳回零,而 getLastError函式會傳回ERROR_PIPE_LISTENING。

根據預設,CreateNamedPipeCreateFile 函式所傳回的所有命名管道句柄,都會啟用封鎖等候模式來建立。 若要在非封鎖等候模式中建立管道,管道伺服器會在呼叫 createNamedPipe 時指定PIPE_NOWAIT。

管道用戶端和管道伺服器都可以在 呼叫 setNamedPipeHandleSt ate 函式時指定PIPE_WAIT或PIPE_NOWAIT來變更管道句柄的等候模式。

注意

支援非封鎖等候模式,以與 Microsoft LAN Manager 2.0 版相容。 此模式不應該用來使用具名管道達到重疊的輸入和輸出 (I/O)。 應該改用重疊的 I/O,因為它可在函式傳回之後,在背景執行耗時的作業。 如需重疊 I/O 的詳細資訊,請參閱 同步和重疊的輸入和輸出