共用方式為


命名管道作業

管道伺服器第一次呼叫 CreateNamedPipe 函式時,它會使用 nMaxInstances 參數來指定可同時存在的管道實例數目上限。 伺服器可以重複呼叫 CreateNamedPipe 來建立管道的其他實例,只要它未超過實例數目上限。 如果函式成功,每個呼叫都會將句柄傳回命名管道實例的伺服器端。

只要管道伺服器建立管道實例,管道用戶端就可以呼叫 createFileCallNamedPipe 函式來連線到該實例。 如果管道實例可用,CreateFile 會將句柄傳回管道實例的用戶端端。 如果沒有可用的管道實例,管道用戶端可以使用 WaitNamedPipe 函式來等候管道變成可用為止。

管道伺服器可以藉由呼叫 ConnectNamedPipe 函式,判斷管道用戶端何時連接到管道實例。 如果管道句柄處於封鎖等候模式,ConnectNamedPipe 在用戶端連線之前不會傳回。

管道客戶端和伺服器可以呼叫數個函式之一,除了 CallNamedPipe 之外,還可以讀取和寫入命名管道。 這些函式的行為取決於管道的類型,以及指定管道句柄生效的模式,如下所示:

  • ReadFileWriteFile 函式可以搭配位元組類型或訊息類型管道使用。
  • ReadFileExWriteFileEx 函式,如果管道句柄已開啟供重疊作業使用,則可以與位元組類型或訊息類型管道搭配使用。
  • PeekNamedPipe 函式可用來讀取,而不需要移除位元組類型管道或訊息類型管道的內容。 PeekNamedPipe 也可以傳回管道實例的其他資訊。
  • 如果呼叫進程的管道句柄設定為訊息讀取模式,TransactNamedPipe 函式可以與訊息類型雙工管道搭配使用。 函式會寫入要求訊息,並在單一作業中讀取回復訊息,以提高網路效能。

在管道客戶端啟動之前,管道伺服器不應該執行封鎖讀取作業。 否則,可能會發生競爭狀況。 這通常發生在初始化程序代碼,例如 C 執行時間連結庫的初始化程式代碼時,需要鎖定和檢查繼承的句柄。

當用戶端和伺服器使用管道實例完成時,伺服器應該先呼叫 FlushFileBuffers 函式,以確保用戶端會讀取寫入管道的所有位元組或訊息。 FlushFileBuffers 不會傳回,直到用戶端從管道讀取所有數據為止。 然後,伺服器會呼叫 DisconnectNamedPipe 函式,以關閉與管道客戶端的連接。 如果尚未關閉,此函式會使用戶端的句柄無效。 管線中的任何未讀取數據會被捨棄。 在用戶端中斷連線之後,伺服器會呼叫 CloseHandle 函式,以關閉其管線實例的句柄。 或者,伺服器可以使用 ConnectNamedPipe,讓新的用戶端連線到管道的這個實例。

進程可以藉由呼叫 getNamedPipeInfo函式來擷取具名管道的相關信息,此函式會傳回管道的類型、輸入和輸出緩衝區的大小,以及可建立的管道實例數目上限。 GetNamedPipeHandleState 函式會報告管道句柄的讀取和等候模式、目前的管道實例數目,以及透過網路通訊管道的其他資訊。 SetNamedPipeHandleState 函式會設定管道句柄的讀取模式和等候模式。 對於與遠端伺服器通訊的管道用戶端,函式也會控制要收集的位元元組數目上限,或傳輸訊息之前等待的時間上限(假設用戶端的句柄未開啟並啟用寫入模式)。