NOM
pthread_attr_setguardsize, pthread_attr_getguardsize - Définir ou
obtenir l’attribut de 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.
La fonction pthread_attr_setguardsize() définit, à la valeur indiquée
par guardsize, la taille de l’attribut contenant la taille de la garde
de l’objet d’attributs de thread attr.
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éé 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.
CONFORMITÉ
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ébordement 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 thread 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
Voir pthread_getattr_np(3).
VOIR AUSSI
mmap(2), mprotect(2), pthread_attr_init(3), pthread_create(3),
pthread_attr_setstack(3), pthread_attr_setstacksize(3), pthreads(7)
COLOPHON
Cette page fait partie de la publication 3.23 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
Cette page de manuel a été traduite et est maintenue par Nicolas
François <nicolas.francois@centraliens.net> et l’équipe francophone de
traduction de Debian.
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> ».