PTHREAD_ATTR_SETGUARDSIZE(3) Руководство программиста Linux 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)

2017-09-15 Linux