首先得到堆栈的底部,并给它的读/写权限以下面的代码。
pthread_attr_t attr;
void * stackaddr;
int * plocal_var;
size_t stacksize;
pthread_getattr_np(pthread_self(), &attr);
pthread_attr_getstack(&attr, &stackaddr, &stacksize);
printf("stackaddr = %p, stacksize = %d\n", stackaddr, stacksize);
plocal_var = (int*)mmap(stackaddr, 4096, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
// Now try to write something
*plocal_var = 4;
,然后你可以得到线程ID,与功能get_thread_id(如下图所示)。请注意,调用大小为4096的mmap
会将栈的边界压入4096,这就是为什么我们在获取局部变量地址时减去4096的原因。
int get_thread_id()
{
pthread_attr_t attr;
char * stackaddr;
int * plocal_var;
size_t stacksize;
pthread_getattr_np(pthread_self(), &attr);
pthread_attr_getstack(&attr, (void**)&stackaddr, &stacksize);
//printf("stackaddr = %p, stacksize = %d\n", stackaddr, stacksize);
plocal_var = (int*)(stackaddr - 4096);
return *plocal_var;
}
你会如何使用这样的地址?在C语言中,“堆栈”的地址不是很好定义,因为语言本身不需要使用堆栈。即使您知道架构使用堆栈,线程的当前帧将随着线程调用并返回函数而一直改变。 – unwind 2012-01-04 15:35:21
uwind,我同意,但是就像我说过的,我可以将我的变量放置在栈底的某处。到最后,我的意思是分配堆栈的结束。所以,如果我们有1 MB的堆栈,我可以把它放下1MB。我知道它的骇人听闻,但我们可以预料,一个应用程序不太可能陷入堆栈底部,并且几个字节将永远保持空闲状态。 – MetallicPriest 2012-01-04 15:38:42
@MetallicPriest:尽管如此,为什么?我喜欢这个问题,但仍然奇怪为什么你不能将数据存储在更容易访问(更安全)的地方。 – 2012-01-04 15:41:01