pthread_attr_setguardsize, pthread_attr_getguardsize -
изменяет/возвращает
атрибут
размера
защиты у
объекта
атрибутов
нити
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 делает
это
правильно,
выделяя
дополнительное
пространство
в конце
стека под
защитную
область.
См.
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 <
[email protected]>, kogamatranslator49
<
[email protected]>, Kogan, Max Is <
[email protected]>, Yuri
Kozlov <
[email protected]> и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]