- bookworm 4.18.1-1
- bookworm-backports 4.24.0-2~bpo12+1
- testing 4.24.0-2
- unstable 4.25.0-1
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 эти функции всегда выполняются успешно (тем не менее, в переносимых приложениях нужно учитывать возможность возврата ошибки).
ВЕРСИИ¶
These functions are provided since 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 делает это правильно, выделяя дополнительное пространство в конце стека под защитную область.
ПРИМЕРЫ¶
СМ. ТАКЖЕ¶
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.
15 декабря 2022 г. | Linux man-pages 6.03 |