Linux中线程堆栈的基址

时间:2016-02-08 16:24:35

标签: linux-kernel stack pthreads

我有一个问题。在linux C编程中,如果我们使用pthread创建一个线程,我们可以通过pthread_self()得到它的tid。 有没有办法简单地获取该线程的基址(使用pthread中的一些API)? 谢谢!

2 个答案:

答案 0 :(得分:0)

正确的方法是使用pthread_getaddr_np(不一定是可移植的,似乎可以与glibc和musl一起使用)和pthread_attr_getstack

#define _GNU_SOURCE //for pthread_getattr_np
#include <pthread.h>

void* thread_main(void* args) {
    //your code here
}

int main() {
    pthread_t thread;
    pthread_create(&thread, NULL, &thread_main, NULL);
    pthread_attr_t attrs;
    pthread_getattr_np(thread, &attrs);
    void* stack_ptr;
    size_t stack_size;
    pthread_attr_getstack(&attrs, &stack_ptr, &stack_size);
    //`stack_ptr` now points to the base address of the spawned thread's stack
    ...
}

如果您尝试避免调用pthread_getaddr_np,则可能会得到意外的结果。如果您使用堆栈地址的dafault值,pthread_create()将忽略它,并选择一个合适的堆栈地址(在linux,gnu libc和musl libc上)。

#define _GNU_SOURCE //for pthread_getattr_np
#include <pthread.h>
#include <stdio.h>

void* thread_main(void* args) {
    //your code here
    return NULL;
}

int main() {
    pthread_t thread;
    pthread_attr_t attrs;
    pthread_attr_init(&attrs);
    void* stack_ptr;
    size_t stack_size;
    pthread_attr_getstack(&attrs, &stack_ptr, &stack_size);
    printf("default stack address:\t%x\n", stack_ptr);

    pthread_create(&thread, &attrs, &thread_main, NULL);
    pthread_getattr_np(thread, &attrs);
    pthread_attr_getstack(&attrs, &stack_ptr, &stack_size);
    //`stack_ptr` now points to the base address of the spawned thread's stack
    printf("real stack address:\t%x\n", stack_ptr);

    return 0;
}

输出:

default stack address:  0
real stack address: d385a000

答案 1 :(得分:-1)

0x00000000。令人惊讶..