摘要
订阅对象的信号。
声明
#include <zircon/syscalls.h>
zx_status_t zx_object_wait_async(zx_handle_t handle,
zx_handle_t port,
uint64_t key,
zx_signals_t signals,
uint32_t options);
说明
zx_object_wait_async()
是一个非阻塞系统调用,会导致数据包
当 handle 指定的对象具有一个或多个
断言指定的 signals。使用 zx_port_wait()
检索数据包。
handle 指向要监视更改的对象,并且必须是可等待的对象。
options 参数可以是 0,也可以是以下一个或多个参数:
- ZX_WAIT_ASYNC_TIMESTAMP,这会导致系统在发生以下情况时捕获时间戳: 触发等待。
- ZX_WAIT_ASYNC_EDGE 会导致端口不将有效信号的数据包加入队列
在调用
zx_object_wait_async()
时触发。
signals 参数是一个位掩码,用于指示对象上的哪些信号 handle 指定的会导致数据包加入队列。
不使用 ZX_WAIT_ASYNC_EDGE
(如果信号中有 any
的信号有效)
当 zx_object_wait_async()
被调用或此后变为活动状态时,数据包将
在 port 上加入队列。
如果使用 ZX_WAIT_ASYNC_EDGE
,数据包将仅在执行一个或多个其他操作之后才会在 port 上加入队列。
信号中的信号已从无效变为有效。使用此选项时
请务必注意,处于非活动状态的信号
zx_object_wait_async()
通话已完成。在这种情况下,可能会错过
任何数据包都不会排入该端口例如,这通常用于
然后再执行非阻塞 I/O,直到信号变为非活动状态,
随后从非活动状态转换为活动状态将导致数据包被排入队列。
数据包加入队列后,将包含当前声明的所有信号
(而不仅仅是 signals 参数中列出的信号)。数据包加入队列后
异步等待结束。没有其他数据包加入队列。请注意,信号
与端口所维护的状态通过“或”操作,因此,您可能会看到所请求的
在 zx_port_wait()
返回时发出信号。
每次调用 zx_object_wait_async()
都会创建一个新的异步等待操作,
即观察器。这些操作不会以任何方式删除重复信息。也就是说,如果
使用相同的参数调用 zx_object_wait_async()
两次,共两项操作
创建项目。如果断言的信号与这些操作匹配,那么两个数据包
将加入队列,每个操作一个。
每个充电桩可执行的操作数量是有限制的。当
已超出,作业政策异常 (ZX_EXCP_POLICY_CODE_PORT_TOO_MANY_OBSERVERS
)
由超出限制的进程引发。
zx_port_cancel()
会通过以下方式终止所有异步等待操作:
handle 和 port。此外,所有数据包
这些操作生成的队列将会从队列中移除。
如果 handle 已关闭,则与其关联的操作也将 已终止,但队列中已有的数据包不受影响。
通过此系统调用生成的数据包的 type 将设置为 ZX_PKT_TYPE_SIGNAL_ONE
且并集的类型为 zx_packet_signal_t
:
typedef struct zx_packet_signal {
zx_signals_t trigger;
zx_signals_t observed;
uint64_t count;
zx_time_t timestamp; // depends on ZX_WAIT_ASYNC_TIMESTAMP
uint64_t reserved1;
} zx_packet_signal_t;
trigger 是指在调用 zx_object_wait_async()
时使用的信号,
观察到的信号是实际观察到的信号,时间戳是时钟单调的
对象状态转换为满足触发条件的时间。如果
选项不包含 ZX_WAIT_ASYNC_TIMESTAMP,则报告为 0。
使用 zx_port_packet_t
的 key 成员跟踪此数据包对应的对象。
权限
handle 必须具有 ZX_RIGHT_WAIT
。
port 的类型必须为 ZX_OBJ_TYPE_PORT
且包含 ZX_RIGHT_WRITE
。
返回值
如果订阅成功,zx_object_wait_async()
会返回 ZX_OK
。
错误
ZX_ERR_INVALID_ARGS
选项的位不是 ZX_WAIT_ASYNC_TIMESTAMP
并设置了 ZX_WAIT_ASYNC_EDGE
。
ZX_ERR_BAD_HANDLE
handle 不是有效的句柄,或 port 不是有效的句柄。
ZX_ERR_WRONG_TYPE
port 不是端口句柄。
ZX_ERR_ACCESS_DENIED
句柄没有 ZX_RIGHT_WAIT
或 port
不包含 ZX_RIGHT_WRITE
。
ZX_ERR_NOT_SUPPORTED
handle 是一个不能等待的句柄。
ZX_ERR_NO_MEMORY
因内存不足而失败。
用户空间没有好办法处理这种(不太可能)错误。
在将来的版本中,此错误不会再发生。
备注
如需详细了解信号及其术语,请参阅信号。