NOM¶
pthread_attr_setguardsize, pthread_attr_getguardsize - Définir ou obtenir
la taille de garde d'un objet d'attributs de thread
SYNOPSIS¶
#include <pthread.h>
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);
Compilez et effectuez l'édition des liens avec l'option -pthread.
DESCRIPTION¶
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.
VALEUR RENVOYÉE¶
En cas de réussite, ces fonctions renvoient 0 ; en cas d'erreur elles
renvoient un numéro d'erreur non nul.
ERREURS¶
POSIX.1-2001 documente une erreur
EINVAL si
attr ou
guardsize n'est pas valable. Sous Linux, ces fonctions réussissent
toujours (mais les applications portables et à l'épreuve du temps
devraient néanmoins prendre en charge une possible valeur de retour).
VERSIONS¶
Ces fonctions sont fournies par la glibc depuis la version 2.1.
POSIX.1-2001.
NOTES¶
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.
BOGUES¶
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.
EXEMPLE¶
Consultez
pthread_getattr_np(3).
VOIR AUSSI¶
mmap(2),
mprotect(2),
pthread_attr_init(3),
pthread_attr_setstack(3),
pthread_attr_setstacksize(3),
pthread_create(3),
pthreads(7)
COLOPHON¶
Cette page fait partie de la publication 3.44 du projet
man-pages Linux.
Une description du projet et des instructions pour signaler des anomalies
peuvent être trouvées à l'adresse
<
http://www.kernel.org/doc/man-pages/>.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Nicolas François et l'équipe francophone de traduction de
Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande «
man -L C
<section> <page_de_man> ».