NAME
管道 - 雙向處理序間通訊
概要
管道是一種雙向傳輸訊息,包含一些位元組資料和一些控點。
說明
管道有兩個端點。每個端點在邏輯上都會維持一個已排序的訊息佇列以便讀取。寫入端點會將訊息排入其他端點的佇列中的訊息。當端點的最後一個控制代碼關閉時,該端點佇列中的未讀取訊息會遭到刪除。由於刪除訊息會關閉訊息內含的任何控點,因此關閉管道端點可能會產生遞迴效果 (例如管道包含訊息,其中包含一個管道等)。
關閉管道的最後一個帳號代碼不會影響先前寫入該頻道的訊息生命週期。如此一來,管道就能具有「啟動且忘記」的語意。
訊息是由一些資料量和一些控點組成。呼叫 zx_channel_write()
會將一則訊息排入佇列,而對 zx_channel_read()
的呼叫會將一則訊息排入佇列 (如有排入佇列)。執行緒可以封鎖,直到訊息透過 zx_object_wait_one()
或其他等待機制處理為止。
或者,呼叫 zx_channel_call()
也會將訊息排入管道的單向佇列,等待對應的回應,然後再將回應訊息移除。在呼叫模式中,系統會透過訊息的前 4 個位元組 (稱為交易 ID) 識別對應的回應。針對使用 zx_channel_call()
編寫的訊息,核心會提供不同的交易 ID (一律採用高位元組合)。
透過管道傳送訊息的程序有兩個步驟。首先,以不可分割的形式將資料寫入管道,並將訊息中所有帳號代碼的擁有權移至這個管道。這項作業一律會耗用控點:在呼叫結束時,所有控點都會留在管道中,或全部捨棄。第二項作業 (管道讀取) 也是類似的:成功時,下一則訊息中的所有控點都會以不可分割的形式移至接收程序的處理資料表。失敗時,除非指定 ZX_CHANNEL_READ_MAY_DISCARD 選項,否則管道會保留擁有權,之後就會捨棄該選項。
有別於其他多種核心物件類型,管道無法重複。因此,只有一個控點與管道端點相關聯,而持有該帳號代碼的程序會視為擁有者。只有擁有者可以讀取或寫入訊息,或將管道端點傳送至其他程序。
當管道端點的擁有權從一個程序移至另一個程序時,即使正在進行寫入,訊息也不會重新排序或遭到截斷。轉移事件之前的訊息屬於先前的擁有者,以及轉移後的訊息則屬於新擁有者。如果在端點轉移時正在進行讀取作業,則適用情況。
即使移除 ZX_RIGHT_DUPLICATE 右方的最後一個控制代碼,其他核心物件也不會提供上述的依序保證。
音效
zx_channel_call()
- 同步傳送訊息並接收回覆zx_channel_create()
- 建立新管道zx_channel_read()
- 收到管道傳來的訊息zx_channel_write()
- 撰寫訊息給管道
zx_object_wait_one()
- 等待單一物件的信號