Linux kernel Linux中线程栈的基址

Linux kernel Linux中线程栈的基址,linux-kernel,stack,pthreads,Linux Kernel,Stack,Pthreads,我有个问题。在linux C编程中,如果我们使用pthread创建一个线程,我们可以通过pthread\u self()获得它的tid。 有没有一种方法可以简单地获取这个线程的基址(使用pthread中的一些API)? 谢谢大家! 它是0x00000000。令人惊讶的是..正确的方法是使用pthread\u getaddr\u np(不一定是可移植的,似乎与glibc和musl一起使用)和pthread\u attr\u getstack #为pthread_getattr_np定义_GNU_S

我有个问题。在linux C编程中,如果我们使用pthread创建一个线程,我们可以通过
pthread\u self()
获得它的tid。 有没有一种方法可以简单地获取这个线程的基址(使用pthread中的一些API)?
谢谢大家!

它是
0x00000000
。令人惊讶的是..

正确的方法是使用
pthread\u getaddr\u np
(不一定是可移植的,似乎与glibc和musl一起使用)和
pthread\u attr\u getstack

#为pthread_getattr_np定义_GNU_SOURCE//
#包括
空*线程\主(空*参数){
//你的代码在这里
}
int main(){
pthread\u t线程;
pthread_create(&thread,NULL,&thread_main,NULL);
pthread_attr_t attrs;
pthread_getattr_np(线程和属性);
void*堆栈ptr;
大小\u t堆栈\u大小;
pthread_attr_getstack(&attrs,&stack_ptr,&stack_size);
//`stack_ptr`现在指向生成线程堆栈的基址
...
}
如果试图避免调用
pthread\u getaddr\u np
,可能会得到意外的结果。如果使用堆栈地址的dafault值,
pthread_create()
将忽略该值并选择合适的堆栈地址(在linux、gnu libc和musl libc上)

#为pthread_getattr_np定义_GNU_SOURCE//
#包括
#包括
空*线程\主(空*参数){
//你的代码在这里
返回NULL;
}
int main(){
pthread\u t线程;
pthread_attr_t attrs;
pthread_attr_init(&attrs);
void*堆栈ptr;
大小\u t堆栈\u大小;
pthread_attr_getstack(&attrs,&stack_ptr,&stack_size);
printf(“默认堆栈地址:\t%x\n”,堆栈\u ptr);
pthread_create(&thread,&attrs,&thread_main,NULL);
pthread_getattr_np(线程和属性);
pthread_attr_getstack(&attrs,&stack_ptr,&stack_size);
//`stack_ptr`现在指向生成线程堆栈的基址
printf(“实际堆栈地址:\t%x\n”,堆栈\u ptr);
返回0;
}
输出:

default stack address:  0
real stack address: d385a000

我猜您可以使用
pthread\u getaddr\u np
后跟
pthread\u attr\u getstack
。另请参阅,您可能被以下事实误导:
pthread\u attr\u init()
给出了默认值
pthread\u attr\u getstackaddr()
;但是
pthread_create()
将这里的值0解释为“将堆栈放在任何需要的地方”。我没有在任何地方的文档中找到这些信息,但是通过实验,我看到了我的答案。