Zircon 信號

說明

信號是可等待的 Zircon 核心物件公開的一小段資訊。每個物件都能公開一或多個信號,多數信號專屬於物件類型。

例如,ZX_CHANNEL_READABLE 信號表示「這個管道端點含有要讀取的訊息」,ZX_PROCESS_TERMINATED 則代表「這個程序已停止執行」。

物件的信號會儲存在 uint32 位元遮罩中,其值 (也就是物件專屬) 則是在標頭 zircon/types.h 中定義。typedef zx_signals_t 是用於參照系統呼叫和其他 API 中的信號位元遮罩。

大多數的物件都可以等待。通訊埠是非等待物件的示例。

狀態、狀態變化及其術語

當位元為 1 時,表示信號為「有效」;位元為 0 時則為「無效」

如果信號因回應事件而設為「Active」(即使狀態為「Active」),表示信號表示為「已宣告」;當信號變成「無效」以回應事件時 (即使信號已「無效」亦然)。

例如:將訊息寫入管道端點時,相對端點的 ZX_CHANNEL_READABLE 信號就會「宣告」 (如果信號尚未啟用,該信號會變成「有效」)。當您從該端點讀取管道端點佇列中的最後一則訊息時,該端點的 ZX_CHANNEL_READABLE 信號就會「終止」 (導致信號變成「無效」)

觀察信號

系統呼叫 zx_object_wait_one()zx_object_wait_many()zx_object_wait_async() 可與通訊埠搭配使用,可用來等待一或多個物件上的指定信號。

如果單一物件上執行多個執行緒,這些系統呼叫的結果可能已在呼叫執行緒實際對其執行時已過時。舉例來說,在頻道上等待 ZX_CHANNEL_READABLE 信號的執行緒可能會從 zx_object_wait_one() 系統呼叫喚醒,只是會發現沒有待處理的訊息,因為另一個執行緒已讀取訊息。

綜合信號

ZX_SIGNAL_HANDLE_CLOSED 信號只是在 zx_object_wait_one()zx_object_wait_many() 的結果中,且表示正在等待的帳號代碼已關閉,導致等待作業取消。

只有在等待本身傳回 ZX_ERR_CANCELED 時,才能經由上述兩個等待呼叫的結果取得這個信號。

使用者信號

這時共有八個使用者信號 (ZX_USER_SIGNAL_0ZX_USER_SIGNAL_7),如果控制代碼具有適當權利 (分別代表 ZX_RIGHT_SIGNALZX_RIGHT_SIGNAL_PEER),則可能使用 zx_object_signal()zx_object_signal_peer() 系統呼叫來轉換或斷言。這些使用者信號一開始一律會停用,且只會由物件信號系統呼叫修改。

另請參閱