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_oneobject_wait_many的返回结果中,表示正在等待的句柄已被关闭,使得等待操作被中止。

当等待本身返回ZX_ERR_CANCELED时,只能通过上述两种等待调用获得此信号。

用户信号

系统中有八个用户信号(从ZX_USER_SIGNAL_0ZX_USER_SIGNAL_7),可以使用zx_object_signal()zx_object_signal_peer() 系统调用来使这些信号置位或解除置位,前提是句柄具有相应的权限(分别为ZX_RIGHT_SIGNALZX_RIGHT_SIGNAL_PEER)。 这些用户信号在初始状态始终是非活跃状态,并且仅能通过对象信号的系统调用进行修改。

另见

object_signal, object_signal_peer, object_wait_async, object_wait_many, object_wait_one.