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
10void*
11threadFunction(void*)
12{
13	int i = 0;
14	printf("variable addr: %p\n", &i);
15	pthread_exit(0);
16	return 0;
17}
18
19
20int
21main(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