1 #include <errno.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <pthread.h>
6
7 #define panic(str) if (ret != 0) { errno = ret; perror(str); return 1; }
8
9
10 void*
threadFunction(void *)11 threadFunction(void*)
12 {
13 int i = 0;
14 printf("variable addr: %p\n", &i);
15 pthread_exit(0);
16 return 0;
17 }
18
19
20 int
main(int argc,char ** argv)21 main(int argc, char **argv)
22 {
23 int ret;
24 pthread_attr_t attr;
25 ret = pthread_attr_init(&attr);
26 panic("init");
27 void* stackAddress;
28 size_t stackSize;
29 ret = pthread_attr_getstack(&attr, &stackAddress, &stackSize);
30 panic("getstack");
31 printf("stackAddress: %p, stackSize: %lu\n", stackAddress, stackSize);
32 stackSize = PTHREAD_STACK_MIN;
33 ret = posix_memalign(&stackAddress, sysconf(_SC_PAGE_SIZE),
34 stackSize);
35 panic("memalign");
36 ret = pthread_attr_setstack(&attr, stackAddress, stackSize);
37 panic("setstack");
38 ret = pthread_attr_getstack(&attr, &stackAddress, &stackSize);
39 panic("getstack");
40 printf("stackAddress: %p, stackSize: %lu\n", stackAddress, stackSize);
41
42 pthread_t thread;
43 ret = pthread_create(&thread, &attr, threadFunction, NULL);
44 panic("create");
45 ret = pthread_join(thread, NULL);
46 panic("join");
47
48 ret = pthread_attr_destroy(&attr);
49 panic("destroy");
50
51 return 0;
52 }
53