Zircon Signals
介绍
信号是Zircon中可等待的内核对象开放给应用程序的位信息。 每个对象可以提供一个或多个信号,它们中一些是通用的,另外一些是特定于对象类型的。
例如,信号ZX_CHANNEL_READABLE表示“此channel端点有要读取的消息”,ZX_PROCESS_TERMINATED表示“此进程已停止运行”。
对象的信号存储在uint32
类型的位掩码中,它们的值(特定于对象)在头文件zircon/types.h
中定义。
zx_signals_t
类型用于引用系统调用和其他API中使用的信号位掩码。
大多数对象都是可等待的,但端口却是不可等待对象的一个例子。 要确定对象是否是可等待的,请使用ZX_INFO_HANDLE_BASIC主题调用object_get_info并核对ZX_OBJ_PROP_WAITABLE权限是否存在。
状态,状态变化及其术语
对于一个信号而言,当它的位值为1时,被称为活跃(Active) 状态;而在它的位值为0时,被称为非活跃(Inactive) 状态。
一个信号当它因响应一个事件而变成活跃状态(即使它已经处于活跃状态)时,被称为置位。 当它因响应一个事件而变成非活跃状态(即使它已经处于非活跃状态)时,被称为取消置位。
例如:当消息被写入channel的一个端点时,反向对等端点的ZX_CHANNEL_READABLE信号将被置位(使得该信号变为活跃状态)。 相反地,当从该端点读取channel队列中的最后一条消息时,该端点的ZX_CHANNEL_READABLE信号位将被取消置位(这会使该信号变为非活跃状态)。
获取信号
系统调用zx_object_wait_one(),zx_object_wait_many() 和zx_object_wait_async()(与端口相结合使用时,)可用于等待一个或多个对象上指定的信号。
常见信号
ZX_SIGNAL_HANDLE_CLOSED
此合成信号仅存在于object_wait_one或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)。 这些用户信号在初始状态始终是非活跃状态,并且仅能通过对象信号的系统调用进行修改。
另见
object_signal, object_signal_peer, object_wait_async, object_wait_many, object_wait_one.