总结
挂起给定任务。目前,可能只有线程或进程句柄可以挂起。
声明
#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_STARTING
和 ZX_EXCP_THREAD_STARTING
调试异常。
权限
handle 必须是 ZX_OBJ_TYPE_THREAD
或 ZX_OBJ_TYPE_PROCESS
类型,并且具有 ZX_RIGHT_WRITE
。
返回值
zx_task_suspend()
会在成功时返回 ZX_OK
。如果失败,则返回负数错误值。
错误
ZX_ERR_BAD_HANDLE
句柄不是有效的句柄。
ZX_ERR_WRONG_TYPE
句柄不是线程或进程句柄。
ZX_ERR_INVALID_ARGS
token 是无效的指针。
ZX_ERR_BAD_STATE
任务即将终止或终止,无法暂停。
ZX_ERR_NO_MEMORY
未能分配内存。
ZX_ERR_NOT_SUPPORTED
发起调用的线程正尝试挂起自身或其某个父任务。
限制
目前仅支持线程和进程句柄。