共用方式為


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

管道伺服器會在CreateNamedPipe函式的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存取權限。

等候模式

管道控制碼的等候模式會決定 ReadFileWriteFileConnectNamedPipe 函式如何處理冗長的作業。 在封鎖等候模式中,函式會無限期等候管道另一端的進程來完成作業。 在非封鎖等候模式中,函式會在需要無限期等候的情況下立即傳回。

當管道空白時, ReadFile 作業會受到管道控制碼的等候模式影響。 使用封鎖等候控制碼時,作業不會順利完成,直到資料從寫入管道的另一端的執行緒取得為止。 使用非封鎖等候控制碼時,函式會立即傳回零,而 GetLastError 函式會傳回ERROR_NO_DATA。

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

當沒有用戶端連線或等候連線到管道實例時, ConnectNamedPipe 作業會受到管道控制碼的等候模式影響。 透過封鎖等候控制碼,連接作業在管道用戶端藉由呼叫 CreateFileCallNamedPipe 函式來連線到管道實例之前,不會成功。 使用非封鎖等候控制碼時,連接作業會立即傳回零,而 GetLastError 函式會傳回ERROR_PIPE_LISTENING。

根據預設, 建立 CreateNamedPipeCreateFile 函式所傳回的所有具名管道控制碼都會啟用封鎖等候模式。 若要以非封鎖等候模式建立管道,管道伺服器會在呼叫 CreateNamedPipe時指定PIPE_NOWAIT。

管線用戶端和管道伺服器都可以藉由在 對 SetNamedPipeHandleState 函式的呼叫中指定PIPE_WAIT或PIPE_NOWAIT來變更管道控制碼的等候模式。

注意

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