zx_task_suspend

摘要

暂停指定任务。目前,只能暂停线程或进程句柄。

声明

#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_RUNNING
  • ZX_THREAD_SUSPENDED

在通过 zx_process_start()zx_thread_start() 启动线程之前,不会断言这两个变量。当线程启动时,它会断言 ZX_THREAD_RUNNING 是否处于挂起状态,但如果处于挂起状态,则会在执行任何代码之前切换到 ZX_THREAD_SUSPENDED

无论任务是否处于暂停状态,系统也会在启动时发送 ZX_EXCP_PROCESS_STARTINGZX_EXCP_THREAD_STARTING 调试异常。

权限

句柄必须是 ZX_OBJ_TYPE_THREADZX_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 调用线程正在尝试挂起自身或其某个父任务。

限制

目前仅支持线程和进程句柄。