Linux
2017-09-15
Aliases: pthread_attr_getstack(3), pthread_attr_getstack(3), pthread_attr_getstack(3), pthread_attr_getstack(3), pthread_attr_getstack(3), pthread_attr_getstack(3)
man-pages-ru
Russian man pages from the Linux Documentation Project
manpages-dev
Manual pages about using GNU/Linux for development
man-pages
Linux kernel and C library user-space interface documentation
ИМЯ
pthread_attr_setstack, pthread_attr_getstack - изменяет/возвращает атрибуты стека из объекта атрибутов нити
ОБЗОР
#include <pthread.h>
int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize); int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
Компилируется и компонуется вместе с -pthread.
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
pthread_attr_getstack(), pthread_attr_setstack():
_POSIX_C_SOURCE >= 200112L
ОПИСАНИЕ
Функция pthread_attr_setstack() изменяет атрибуты адреса и размера стека в объекте атрибутов нити, на который указывает attr, на значения, задаваемые в stackaddr и stacksize, соответственно. Данными атрибутами задаёт расположение и размер стека, который будет использоваться нитью, создаваемой с использованием объекта атрибутов нити attr.
Значение stackaddr должно указывать на самый младший адресуемый байт буфера из stacksize байт, выделенного вызывающим. Страницы выделенного буфера должны быть доступны на чтение и запись.
Функция pthread_attr_getstack() возвращает атрибуты адреса и размера стека из объекта атрибутов нити, на который указывает attr, в буфер, на который указывает stackaddr и stacksize, соответственно.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении эти функции возвращают 0; при ошибке возвращается ненулевой номер ошибки.
ОШИБКИ
Функция pthread_attr_setstack() может завершиться со следующей ошибкой:
В POSIX.1 также описана ошибка EACCES, которая возникает, если область стека, определённая stackaddr и stacksize, недоступна вызывающему на чтение и запись.
EINVAL | Значение stacksize меньше PTHREAD_STACK_MIN (16384) байт. В некоторых системах эта ошибка также может возникать, если значения stackaddr или stackaddr + stacksize не выровнены правильным образом. |
ВЕРСИИ
Эти функции определены в glibc начиная с версии 2.2.
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение |
pthread_attr_setstack(), pthread_attr_getstack() | Безвредность в нитях | MT-Safe |
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.
ЗАМЕЧАНИЯ
Эти функции нужны приложениям, в которых нужно размещать стек в определённом месте. В большинстве приложений это не нужно и эти функции использовать не стоит (используйте pthread_attr_setstacksize(3), если приложению нужно задать только размер стека, отличный от умолчательного).
Когда приложение использует pthread_attr_setstack(), оно самостоятельно выделяет место под стек. Защитный размер, задаваемый pthread_attr_setguardsize(3), игнорируется. Если его учитывать необходимо, то приложение должно самостоятельно выделять защитную область (одну или несколько страниц, защищённых от чтения и записи) для обработки возможного переполнения стека.
Адрес, указанный в stackaddr, должен быть выровнен соответствующим образом: для полной переносимости выравнивайте его по границе страницы (sysconf(_SC_PAGESIZE)). Для выделения полезно использовать функцию posix_memalign(3). Вероятно, значение stacksize также должно быть кратно размеру системной страницы.
Если attr используется при создании нескольких нитей, то вызывающий должен изменять атрибут адреса стека между вызовами pthread_create(3); в противном случае нити будут пытаться использовать одну и ту же область памяти для стека и возникнет хаос.
ПРИМЕР
Смотрите pthread_attr_init(3).