摘要
为给定作业、进程或线程创建异常通道。
声明
#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_TRANSFERZX_RIGHT_WAITZX_RIGHT_READ
异常通道数
每个任务最多可以有一个常规异常通道和一个调试器异常通道,但作业除外。单个作业最多可以有 ZX_EXCEPTION_CHANNEL_JOB_DEBUGGER_MAX_COUNT 个调试器异常通道。
尝试在已达到给定类型通道数上限的任务上创建异常通道会导致 ZX_ERR_ALREADY_BOUND。
异常消息
发生异常时,通道将收到一条消息,其中包含一个异常句柄和一个 zx_exception_info_t 数据。
线程将保持阻塞状态,直到收到的异常
句柄关闭为止,此时线程将恢复运行,或者异常处理
将根据所选行为继续进行(请参阅 ZX_PROP_EXCEPTION_STATE
中的 zx_object_get_property())。
解除绑定
关闭创建的通道句柄将取消注册异常处理程序。如果异常消息在通道关闭时正在等待,则异常处理将继续执行搜索顺序中的下一个处理程序。
权限
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 handle 不是有效的句柄。
ZX_ERR_BAD_STATE handle 正在终止或已终止。
ZX_ERR_INVALID_ARGS options 中传递了错误的值。
ZX_ERR_NO_MEMORY 因内存不足而失败。
用户空间没有很好的方法来处理此(不太可能发生的)错误。
在未来的 build 中,此错误将不再发生。
ZX_ERR_WRONG_TYPE handle 不是作业、进程或线程的句柄。