摘要
暂停指定任务。目前,只能暂停线程或进程句柄。
声明
#include <zircon/syscalls.h>
zx_status_t zx_task_suspend(zx_handle_t handle, zx_handle_t* token);
说明
zx_task_suspend() 会导致所请求的任务暂停执行。任务暂停不是同步的,任务可能在调用返回之前不会暂停。在调用 zx_task_suspend() 后,任务很快就会被暂停,除非它当前在内核中被阻塞,在这种情况下,它会在解除阻塞后被暂停。
任务可以在开始之前暂停和/或恢复。如果任务在暂停状态下启动,则会在执行任何代码之前进入暂停状态。同样,在暂停的进程上启动新线程也会在线程执行任何代码之前将其暂停。
对已暂停的任务调用 zx_task_kill() 将成功终止该任务。
任务无法暂停自身或其任何父任务,因为这样一来,它将永远无法收到暂停令牌,并且无法恢复执行。
正在恢复
如需允许任务恢复,请关闭暂停令牌句柄。只要有任何未关闭的挂起令牌,任务就会一直处于挂起状态。与挂起类似,恢复是异步的,因此即使没有其他挂起令牌处于打开状态,当 zx_handle_close() 调用返回时,线程也可能不在运行状态。
信号和例外情况
线程可以断言两种相关信号:
ZX_THREAD_RUNNINGZX_THREAD_SUSPENDED
在通过 zx_process_start() 或 zx_thread_start() 启动线程之前,不会断言这两个变量。当线程启动时,它会断言 ZX_THREAD_RUNNING 是否处于挂起状态,但如果处于挂起状态,则会在执行任何代码之前切换到 ZX_THREAD_SUSPENDED。
无论任务是否处于暂停状态,系统也会在启动时发送 ZX_EXCP_PROCESS_STARTING 和 ZX_EXCP_THREAD_STARTING 调试异常。
权限
句柄必须是 ZX_OBJ_TYPE_THREAD 或 ZX_OBJ_TYPE_PROCESS 类型,并且具有 ZX_RIGHT_WRITE。
返回值
如果成功,zx_task_suspend() 会返回 ZX_OK。
如果失败,则返回负错误值。
错误
ZX_ERR_BAD_HANDLE handle 不是有效的 handle。
ZX_ERR_WRONG_TYPE handle 不是线程或进程句柄。
ZX_ERR_INVALID_ARGS token 是指向无效位置的指针。
ZX_ERR_BAD_STATE 相应任务已处于终止或已终止状态,无法暂停。
ZX_ERR_NO_MEMORY 未能分配内存。
ZX_ERR_NOT_SUPPORTED 调用线程正在尝试挂起自身或其某个父任务。
限制
目前仅支持线程和进程句柄。