管道伺服器會指定 CreateNamedPipe 函式之 dwOpenMode 參數中的管道存取、重疊和寫入模式。 管道用戶端可以使用 createFile 函式,為管道句柄指定這些開啟模式。
存取模式
設定管道存取模式相當於指定與管道伺服器句柄相關聯的讀取或寫入存取權。 下表顯示您可以使用 createNamedPipe 指定之每個存取模式的對等泛型存取權。
| 存取模式 | 對等的泛型存取權 |
|---|---|
| PIPE_ACCESS_INBOUND | GENERIC_READ |
| PIPE_ACCESS_OUTBOUND | GENERIC_WRITE |
| PIPE_ACCESS_DUPLEX | GENERIC_READ |GENERIC_WRITE |
如果管道伺服器建立具有PIPE_ACCESS_INBOUND的管道,則管道伺服器是唯讀的管道伺服器,而管道用戶端則是唯讀的。 如果管道伺服器建立具有PIPE_ACCESS_OUTBOUND的管道,則管道是管道伺服器的寫入,而管道用戶端則是只讀的。 使用管線伺服器和管道用戶端建立PIPE_ACCESS_DUPLEX的管道是可擦寫的。
使用 CreateFile 連接到命名管道的管道用戶端,必須在與管道伺服器所指定的存取模式相容的 dwDesiredAccess 參數中指定訪問許可權。 例如,客戶端必須指定GENERIC_READ存取權,以開啟管道伺服器使用 PIPE_ACCESS_OUTBOUND建立的管道句柄。 管道的所有實例的存取模式都必須相同。
若要讀取管道屬性,例如讀取模式或封鎖模式,管道句柄必須具有FILE_READ_ATTRIBUTES訪問許可權;若要寫入管道屬性,管道控點必須具有FILE_WRITE_ATTRIBUTES訪問許可權。 這些訪問許可權可以與適用於管道的一般訪問許可權結合:GENERIC_READ只讀管道的FILE_WRITE_ATTRIBUTES,或僅寫入管道FILE_READ_ATTRIBUTES GENERIC_WRITE。 以這種方式限制訪問許可權,為管道提供更好的安全性。
重疊模式
在重疊模式中,執行長時間讀取、寫入和連接作業的函式可以立即傳回。 這可讓線程在背景執行耗時的作業時執行其他作業。 若要指定重疊模式,請使用 FILE_FLAG_OVERLAPPED 旗標。 如需詳細資訊,請參閱 同步和重疊的輸入和輸出。
CreateFile 函式可讓管道用戶端使用 dwFlagsAndAttributes 參數,為其管道控點設定重疊模式 (FILE_FLAG_OVERLAPPED)。
Write-Through 模式
使用 FILE_FLAG_WRITE_THROUGH指定寫入模式。 此模式只會影響不同計算機上管道用戶端與管道伺服器之間的位元組類型管道寫入作業。 在寫入模式中,寫入命名管道的函式不會傳回,直到數據透過網路傳輸並傳送至遠端電腦上的管道緩衝區為止。 寫入模式適用於需要每個寫入作業同步處理的應用程式。
如果未啟用寫入模式,系統會緩衝處理數據,以提升網路作業的效率,直到累積最少的位元組數目,或直到經過最長的時間週期為止。 緩衝可讓系統將多個寫入作業合併成單一網路傳輸。 這表示寫入作業可以在系統將數據放入輸出緩衝區之後順利完成,但在系統透過網路傳輸數據之前。
CreateFile 函式可讓管道用戶端使用 dwFlagsAndAttributes 參數,為其管道句柄設定寫入模式(FILE_FLAG_WRITE_THROUGH)。 在建立管道控點之後,無法變更管道控點的寫入模式。 伺服器和用戶端句柄對相同管道實例的寫入模式可能不同。
管道用戶端可以使用 SetNamedPipeHandleState 函式來控制傳輸前的位元組數和逾時期間,該管道會停用寫入模式的管道。 對於唯讀管道,管道句柄必須使用GENERIC_READ和FILE_WRITE_ATTRIBUTES訪問許可權來開啟。