首先得到堆棧的底部,並給它的讀/寫權限以下面的代碼。
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