PTHREAD_ATTR_SETGUARDSIZE(3)

ИМЯ
pthread_attr_setguardsize, pthread_attr_getguardsize - изменяет/возвращает атрибут размера защиты у объекта атрибутов нити

ОБЗОР
#include <pthread.h>

int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
int pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guardsize);

Компилируется и компонуется вместе с -pthread.

ОПИСАНИЕ
Функция pthread_attr_setguardsize() изменяет атрибут размера защиты у объекта атрибутов нити, на который указывает attr, в значение guardsize.

Если guardsize больше 0, то для каждой новой нити, созданной с использованием атрибута attr, система выделяет дополнительную область не менее guardsize байт в конце стека нити, которая служит как защитная область стека (но смотрите ДЕФЕКТЫ).

Если guardsize равно 0, то новые нити, создаваемые с использованием attr, не будут иметь защитной области.

Размер защиты по умолчанию совпадает с размером системной страницы.

Если в attr установлен атрибут адреса стека (с помощью pthread_attr_setstack(3) или pthread_attr_setstackaddr(3)), означающий, что вызывающий выделяет стек для нити, то атрибут размера защиты игнорируется (т. е., система не создаёт защитную область): само приложение должно обрабатывать переполнение стека (возможно, с помощью mprotect(2), для задания защитной области в конце выделенного стека).

Функция pthread_attr_getguardsize() возвращает атрибут размера защиты у объекта атрибутов нити, на который указывает attr, в буфер на который указывает guardsize.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении эти функции возвращают 0; при ошибке возвращается ненулевой номер ошибки.

ОШИБКИ
В POSIX.1 описана ошибка EINVAL при некорректном значении attr или guardsize. В Linux эти функции всегда выполняются успешно (тем не менее, в переносимых приложениях нужно учитывать возможность возврата ошибки).

ВЕРСИИ
Эти функции доступны в glibc начиная с версии 2.1.

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
pthread_attr_setguardsize(), pthread_attr_getguardsize() | Безвредность в нитях | MT-Safe

СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.

ЗАМЕЧАНИЯ
Защитная область состоит из страниц виртуальной памяти, которые защищены от чтения и записи. Если нить переполнит свой стек и попадёт в защитную область, то на большинстве аппаратных архитектур она получит сигнал SIGSEGV и таким образом узнает о переполнении. Защитные области начинаются на границах страниц, а размер защиты внутри округляется до размера системной страницы при создании нити (тем не менее, функция pthread_attr_getguardsize() возвращает размер защиты, установленный pthread_attr_setguardsize()).

Установка размера защиты в нулевое значение полезно для экономии памяти в приложениях, которые создают много нитей и знают, что переполнение стека никогда не произойдёт.

Указание размера защиты больше чем размер по умолчанию может потребоваться для обнаружения переполнений стека при выделении в нити больших структур данных в стеке.

ДЕФЕКТЫ
В glibc 2.8 реализация нитей NPTL добавляет защитную область к размеру выделяемого стека, а не выделяет дополнительное пространство в конце стека как требуется POSIX.1 (это может приводить к ошибке EINVAL в pthread_create(3), если значение размера защиты слишком большое и не оставляет место именно под стек).

Устаревшая реализация LinuxThreads делает это правильно, выделяя дополнительное пространство в конце стека под защитную область.

ПРИМЕР
См. pthread_getattr_np(3).

СМОТРИТЕ ТАКЖЕ
mmap(2), mprotect(2), pthread_attr_init(3), pthread_attr_setstack(3), pthread_attr_setstacksize(3), pthread_create(3), pthreads(7)