简介
信号是可等待的 zircon 内核对象向应用公开的单位信息。每个对象可以公开一个或多个信号,大多数信号都特定于对象的类型。
例如,信号 ZX_CHANNEL_READABLE 表示“此通道端点有要读取的消息”,ZX_PROCESS_TERMINATED 表示“此进程停止运行”。
对象的信号存储在 uint32
位掩码中,并且其值(特定于对象)在标头 zircon/types.h
中定义。typedef zx_signals_t
用于引用系统调用和其他 API 中的信号位掩码。
大多数对象都是可等待的。端口就是一个不可等待的对象。
状态、状态变更及其术语
当信号的位为 1 时,系统会说此信号处于“活跃”状态;当信号的位为 0 时,则称之为“非活跃”。
如果某个信号为响应事件而变为活跃状态(即使该信号已处于活跃状态),该信号也会被视为已断言;而当该信号因响应事件而变为非活跃状态时(即使该信号已处于非活跃状态,也是如此)。
例如:当消息写入通道端点时,对对端点的 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_object_signal()
和 zx_object_signal_peer()
系统调用声明或撤消这些信号,但前提是句柄拥有相应的权限(分别为 ZX_RIGHT_SIGNAL 或 ZX_RIGHT_SIGNAL_PEER)。这些用户信号最初始终处于非活动状态,并且仅由对象信号系统调用修改。
另请参阅
zx_object_signal()
zx_object_signal_peer()
zx_object_wait_async()
zx_object_wait_many()
zx_object_wait_one()