pthread_getthrds_np 子例程

用途

检索线程的注册和堆栈信息。

线程库 (libpthreads.a)

语法

#include <pthread.h>

int pthread_getthrds_np (thread, mode, buf, bufsize, regbuf, regbufsize)
pthread_t *ptid;
int mode;
struct __pthrdsinfo *buf;
int bufsize;
void *regbuf;
int *regbufsize;

描述

pthread_getthrds_np 子例程检索有关线程 线程 及其底层内核线程的状态的信息,包括寄存器和堆栈信息。 线程 thread 必须处于暂挂状态才能提供线程的注册信息。

参数

表 1. 参数
描述
线程 指向线程的指针。 在输入时,它标识操作的目标线程,或者 0 用于对线程列表中的第一个条目进行操作。 在输出时,它标识线程列表中的下一个条目,或者 0 (如果已到达列表的末尾)。 pthread_getthrds_np 可用于遍历整个线程列表,方法是从指向 0 的 线程 开始,并重复调用 pthread_getthrds_np ,直到它返回指向 0 的 线程 为止。
模式 指定查询类型。 可以将这些值按位排序,以指定多种类型的查询。
pthrdsinfo_query_gprs
获取通用寄存器
pthrdsinfo_query_sprs
获取专用寄存器
pthrdsinfo_query_fprs
获取浮点寄存器
pthrdsinfo_query_regs
获取以上所有寄存器
pthrdsinfo_query_tid
获取内核线程标识
pthrdsinfo_query_tls
获取线程本地存储器信息。

此值可以与方式参数的任何值一起使用。 将线程本地存储器信息返回给调用者提供的缓冲区 regbuf中的调用者。 如果缓冲区对于数据而言太小,那么缓冲区将填充到缓冲区末尾,并且将返回 ERANGE 。 调用者还提供缓冲区的大小 regbufsize,返回时,会将其更改为线程本地存储器信息的大小,即使它不适合缓冲区。

以图元数组形式返回线程本地存储器信息: 内存地址和 TLS 区域 (由装入程序分配的唯一编号)。 TLS 区域还包含在 loadquery返回的装入程序信息结构中。 如果需要任何其他信息 (例如, TLS 大小) ,那么可以在该结构中找到该信息。
#typedef struct __pthrdstlsinfo{
        void *pti_vaddr;
        int   pti_region;
    } PTHRDS_TLS_INFO;
pthrdsinfo_query_extctx
获取扩展机器上下文
pthrdsinfo_query_all
获取所有内容 (扩展上下文除外,必须显式请求该上下文)
buf 指定将由 pthread_getthrds_np填充的结构 __pthrdsinfo 结构的地址。 返回时,此结构保存以下数据 (取决于请求的查询类型):
__pi_ptid
线程的线程标识
__pi_tid
线程的内核线程标识,或者 0 (如果线程没有内核线程)
__pi_state
线程的状态,等于下列其中一项:
pthrdsinfo_state_run
线程正在运行
pthrdsinfo_state_ready
线程已准备好运行
pthrdsinfo_state_idle
正在初始化线程
pthrdsinfo_state_sleep
线程正在休眠
pthrdsinfo_state_term
线程已终止
pthrdsinfo_state_notsup
错误条件
__pi_suspended
1 (如果线程已暂挂) , 0 (如果线程未暂挂)
__pi_返还
线程的返回状态
__pi_ustk
线程的用户堆栈指针
__pi_context
线程的上下文 (注册信息)

如果请求 PTHRDSINFO_QUERY_EXTCTX 方式,那么 buf 指定 _pthrdsinfox 结构的地址,除上述所有信息外,该结构还包含以下内容:

__pi_ec
线程的扩展上下文 (扩展寄存器状态)
bufsize __pthrdsinfo__pthrdsinfox 结构的大小 (以字节为单位)。
正则表达式 用于保存寄存器保存数据 和从内核传递 TLS 信息 (如果线程在系统调用中) 的缓冲区的位置。
正则表达式大小 指向 regbuf 缓冲区大小的指针。 在输入时,它标识缓冲区的最大大小 (以字节为单位)。 在输出时,它标识注册保存数据的字节数 并传递 TLS 信息。 如果线程不在系统调用中,那么不存在从内核返回的寄存器保存数据,并且 regbufsize 为 0。 如果寄存器保存数据的大小大于输入值 regbufsize,那么由输入值 regbufsize 指定的字节数将复制到 regbufpthread_getthrds_np() 将返回 ERANGE ,而输出值 regbufsize 指定保存所有寄存器保存数据所需的字节数。

返回值

如果成功, pthread_getthrds_np 函数将返回零。 否则,将返回错误号以指示错误。

错误代码

如果发生以下情况, pthread_getthrds_np 函数将失败:

表 2。 错误代码
描述
EINVAL threadbuf 为 NULL ,或者 bufsize 不等于库中 __pthrdsinfo 结构的大小。
ESRCH 找不到与线程标识 thread指定的线程相对应的线程。
ERANGE regbuf 不够大,无法处理所有寄存器保存数据。
ENOMEM 内存不足,无法执行此操作。