Scroll to navigation

PTHREAD_ATTR_SETGUARDSIZE(3) Manuel du programmeur Linux PTHREAD_ATTR_SETGUARDSIZE(3)

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.

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é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.52 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 à <perkamon-fr@traduc.org>.

Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».

24 octobre 2008 Linux