好的,访问线程堆栈的一种方法是自己分配堆栈内存并在创建线程时分配它。这可以通过pthread_attr_setstack() 调用来实现。
以下代码将线程堆栈设置为手动分配的内存(此处为 malloc),而不是系统分配它。稍后您可以在创建线程后访问 mystack 指针。此类代码的一个用例是,您可以转储线程堆栈以获取其快照,然后您可以恢复该线程。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <limits.h>
void *thread(void *arg) {
char *ret;
printf("thread() entered with argument '%s'\n", (char *)arg);
if ((ret = (char*) malloc(20)) == NULL) {
perror("malloc() error");
exit(2);
}
strcpy(ret, "This is a test");
pthread_exit(ret);
}
int main(void)
{
pthread_attr_t attr;
int rc;
pthread_t thid;
void *ret;
void *mystack;
size_t mystacksize = 2 * PTHREAD_STACK_MIN;
if (pthread_attr_init(&attr) == -1) {
exit(1);
}
/* Get a big enough stack and align it on 4K boundary. */
mystack = malloc(PTHREAD_STACK_MIN * 3);
if (mystack != NULL) {
printf("Using PTHREAD_STACK_MIN to align stackaddr %x.\n", mystack);
mystack = (void *)((((long)mystack + (PTHREAD_STACK_MIN - 1)) /
PTHREAD_STACK_MIN) * PTHREAD_STACK_MIN);
} else {
exit(2);
}
printf("Setting stackaddr to %x\n", mystack);
printf("Setting stacksize to %x\n", mystacksize);
rc = pthread_attr_setstack(&attr, mystack, mystacksize);
if (rc != 0) {
printf("pthread_attr_setstack returned: %d\n", rc);
exit(3);
} else {
printf("Set stackaddr to %x\n", mystack);
printf("Set stacksize to %x\n", mystacksize);
}
if (pthread_create(&thid, &attr, thread, "thread 1") != 0) {
exit(1);
}
if (pthread_join(thid, &ret) != 0) {
exit(3);
}
printf("thread exited with '%s'\n", ret);
rc = pthread_attr_destroy(&attr);
if (rc != 0) {
exit(5);
}
exit(0);
}
如果这是您想要的,请告诉我们。抱歉,缩进和编码风格不好。