Provided by: manpages-ru-dev_4.18.1-1_all bug

ИМЯ

       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(),                           │ Безвредность в нитях │ MT-Safe  │
       │pthread_attr_getguardsize()                            │                      │          │
       └───────────────────────────────────────────────────────┴──────────────────────┴──────────┘

СТАНДАРТЫ

       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
       <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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

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