Scroll to navigation

pthread_attr_setguardsize(3) Library Functions Manual pthread_attr_setguardsize(3)

ИМЯ

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

LIBRARY

POSIX threads library (libpthread, -lpthread)

СИНТАКСИС

#include <pthread.h>
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
int pthread_attr_getguardsize(const pthread_attr_t *restrict attr,
                              size_t *restrict guardsize);

ОПИСАНИЕ

Функция 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 эти функции всегда выполняются успешно (тем не менее, в переносимых приложениях нужно учитывать возможность возврата ошибки).

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
pthread_attr_setguardsize(), pthread_attr_getguardsize() Безвредность в нитях MT-Safe

СТАНДАРТЫ

POSIX.1-2008.

ИСТОРИЯ

glibc 2.1. POSIX.1-2001.

ЗАМЕЧАНИЯ

Защитная область состоит из страниц виртуальной памяти, которые защищены от чтения и записи. Если нить переполнит свой стек и попадёт в защитную область, то на большинстве аппаратных архитектур она получит сигнал 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)

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Alexey, Azamat Hackimov <azamat.hackimov@gmail.com>, kogamatranslator49 <r.podarov@yandex.ru>, Kogan, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

20 июля 2023 г. Linux man-pages 6.05.01