說明
信號是可等待的 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_0 到 ZX_USER_SIGNAL_7),如果控制代碼具有適當權利 (分別代表 ZX_RIGHT_SIGNAL 或 ZX_RIGHT_SIGNAL_PEER),則可能使用 zx_object_signal()
和 zx_object_signal_peer()
系統呼叫來轉換或斷言。這些使用者信號一開始一律會停用,且只會由物件信號系統呼叫修改。
另請參閱
zx_object_signal()
zx_object_signal_peer()
zx_object_wait_async()
zx_object_wait_many()
zx_object_wait_one()