#include <pthread.h> int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize); int pthread_attr_getstack(pthread_attr_t *attr, void **stackaddr, size_t *stacksize); Compile and link with -pthread.
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
pthread_attr_getstack(), pthread_attr_setstack(): _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
stackaddr should point to the lowest addressable byte of a buffer of stacksize bytes that was allocated by the caller. The pages of the allocated buffer should be both readable and writable.
The pthread_attr_getstack() function returns the stack address and stack size attributes of the thread attributes object referred to by attr in the buffers pointed to by stackaddr and stacksize, respectively.
POSIX.1-2001 also documents an EACCES error if the stack area described by stackaddr and stacksize is not both readable and writable by the caller.
When an application employs pthread_attr_setstack(), it takes over the responsibility of allocating the stack. Any guard size value that was set using pthread_attr_setguardsize(3) is ignored. If deemed necessary, it is the application's responsibility to allocate a guard area (one or more pages protected against reading and writing) to handle the possibility of stack overflow.
The address specified in stackaddr should be suitably aligned: for full portability, align it on a page boundary (sysconf(_SC_PAGESIZE)). posix_memalign(3) may be useful for allocation. Probably, stacksize should also be a multiple of the system page size.
If attr is used to create multiple threads, then the caller must change the stack address attribute between calls to pthread_create(3); otherwise, the threads will attempt to use the same memory area for their stacks, and chaos will ensue. .SHEXAMPLE See pthread_attr_init(3).