总结
为给定的作业、进程或线程创建例外渠道。
声明
#include <zircon/syscalls.h>
zx_status_t zx_task_create_exception_channel(zx_handle_t handle,
uint32_t options,
zx_handle_t* out);
说明
zx_task_create_exception_channel()
会创建一个将接收来自线程、进程或作业的异常的通道。
handle 是要接收异常的线程、进程或作业句柄。
options 可以是 0 或 ZX_EXCEPTION_CHANNEL_DEBUGGER
,用于注册调试异常(仅限进程或作业)。
如果成功,out 将使用新创建的频道端点填充。此频道将处于只读状态,具有以下权限:
ZX_RIGHT_TRANSFER
ZX_RIGHT_WAIT
ZX_RIGHT_READ
例外渠道的数量
除了作业外,每个任务最多只能有一个常规异常通道和一个调试程序异常通道。单个作业最多可以有 ZX_EXCEPTION_CHANNEL_JOB_DEBUGGER_MAX_COUNT
个调试程序异常通道。
如果任务已具有给定类型的通道数量上限,则尝试为其创建异常通道将导致 ZX_ERR_ALREADY_BOUND
。
异常消息
发生异常时,通道将收到一条消息,其中包含一个异常句柄和一个 zx_exception_info_t
数据。
线程在异常中会一直处于阻塞状态,直到接收到的异常句柄关闭为止,此时线程要么恢复,要么根据所选行为继续进行(请参阅 zx_object_get_property()
中的 ZX_PROP_EXCEPTION_STATE
)。
解除绑定
关闭已创建的渠道句柄将取消注册异常处理程序。如果异常消息在关闭时在通道中等待,异常处理将继续执行搜索顺序中的下一个处理程序。
权限
handle 必须具有 ZX_RIGHT_INSPECT
、ZX_RIGHT_DUPLICATE
、ZX_RIGHT_TRANSFER
和 ZX_RIGHT_MANAGE_THREAD
。
如果 handle 的类型为 ZX_OBJ_TYPE_JOB
或 ZX_OBJ_TYPE_PROCESS
,则它必须具有 ZX_RIGHT_ENUMERATE
。
返回值
zx_task_create_exception_channel()
会在成功时返回 ZX_OK
。如果失败,则返回负数错误值。
错误
ZX_ERR_ACCESS_DENIED
调用方已实施作业政策,防止创建新频道。
ZX_ERR_ALREADY_BOUND
:给定类型的异常通道数量上限已绑定到 handle。
ZX_ERR_BAD_HANDLE
句柄不是有效的句柄。
ZX_ERR_BAD_STATE
标识名即将停用或已终止。
ZX_ERR_INVALID_ARGS
在 options 中传递了错误值。
ZX_ERR_NO_MEMORY
由于内存不足而失败。
用户空间没有什么方法来处理此(不太可能)错误。在以后的 build 中,此错误不会再发生。
ZX_ERR_WRONG_TYPE
句柄不是作业、进程或线程的句柄。