pthread_attr_setguardsize, pthread_attr_getguardsize - Définir ou obtenir
la taille de garde d'un objet d'attributs de thread
Bibliothèque de threads POSIX (
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);
La fonction
pthread_attr_setguardsize() définit l'attribut de
taille de garde de l'objet d'attributs de thread auquel
thread fait
référence à la valeur indiquée par
guardsize.
Si
guardsize est positif, alors, pour chaque thread créé
avec
attr, le système alloue une région
supplémentaire d'au moins
guardsize octets à la fin de la
pile du thread afin de servir de zone de protection pour la pile (voir la
section BOGUES).
Si
guardsize est nul, les nouveaux threads créés avec
attr n'auront pas de zone de protection.
La taille de garde par défaut est la taille d'une page système.
Si l'adresse de la pile a été définie dans
attr (en
utilisant
pthread_attr_setstack(3) ou
pthread_attr_setstackaddr(3)), ce qui signifie que l'appelant alloue la
pile du thread, alors l'attribut contenant la taille de garde est
ignoré (c'est-à-dire, aucune zone de garde n'est
créée par le système) : il est de la
responsabilité de l'application de prendre en charge les
débordements de pile (peut-être en utilisant
mprotect(2)
pour définir manuellement une zone de protection à la fin de la
pile qui a été allouée).
La fonction
pthread_attr_getguardsize() renvoie, dans le tampon
pointé par
guardsize, l'attribut contenant la taille de garde de
l'objet d'attributs de thread auquel
attr fait référence.
En cas de succès, ces fonctions renvoient
0 ; en cas
d'erreur, elles renvoient un code d'erreur non nul.
POSIX.1 documents an
EINVAL error if
attr or
guardsize is
invalid. On Linux these functions always succeed (but portable and
future-proof applications should nevertheless handle a possible error return).
These functions are provided since glibc 2.1.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
pthread_attr_setguardsize(),
pthread_attr_getguardsize() |
Sécurité des threads |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
Une zone de garde consiste en des pages de mémoire virtuelles qui sont
protégées pour empêcher des accès en lecture ou
écriture. Si la pile d'un thread déborde dans la zone de garde,
alors, pour la plupart des architectures matérielles, il reçoit
un signal
SIGSEGV, ce qui le prévient du débordement. Les
zones de protection démarrent sur des limites de pages, et la taille de
garde est arrondie en interne au multiple de taille de pages système
supérieur lors de la création d'un thread (cependant,
pthread_attr_getguardsize() renvoie la taille de garde qui a
été définie par
pthread_attr_setguardsize()).
Définir une taille de garde de 0 peut être utile pour
économiser de la mémoire dans une application qui crée
beaucoup de thread et sait qu'il n'y aura jamais de débordement de la
pile.
Choisir une taille de garde supérieure à la taille par
défaut peut être nécessaire pour détecter des
débordements de pile si un thread alloue des structures de
données importantes sur la pile.
Au moment de la glibc 2.8, l'implémentation des threads NPTL place la
zone de protection dans la taille allouée à la pile,
plutôt que d'allouer de l'espace supplémentaire à la fin
de la pile, comme exigé par POSIX.1 (ceci peut causer une erreur
EINVAL lors de
pthread_create(3) si la taille de garde est trop
importante, ne laissant en fait pas de place à la pile).
L'implémentation obsolète LinuxThreads faisait ce qu'il fallait,
en allouant de l'espace supplémentaire à la fin de la pile pour
la zone de protection.
Consultez
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)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Frédéric Hantrais <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]