.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (c) 2008 Linux Foundation, written by Michael Kerrisk .\" .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH pthread_getattr_np 3 "20 juillet 2023" "Pages du manuel de Linux 6.05.01" .SH NOM pthread_getattr_np \- Obtenir les attributs d'un thread créé .SH BIBLIOTHÈQUE Bibliothèque de threads POSIX (\fIlibpthread\fP, \fI\-lpthread\fP) .SH SYNOPSIS .nf \fB#define _GNU_SOURCE\fP /* Consultez feature_test_macros(7) */ \fB#include \fP .PP \fBint pthread_getattr_np(pthread_t \fP\fIthread\fP\fB, pthread_attr_t *\fP\fIattr\fP\fB);\fP .fi .SH DESCRIPTION La fonction \fBpthread_getattr_np\fP() initialise l'objet d'attributs de thread auquel \fIattr\fP fait référence de telle sorte qu'il contienne les valeurs réelles d'attributs qui décrivent le thread \fIthread\fP en cours d'exécution. .PP Les valeurs d'attribut renvoyées peuvent être différentes des valeurs d'attribut correspondantes fournies dans l'objet \fIattr\fP utilisé pour créer le thread avec \fBpthread_create\fP(3). En particulier, les attributs suivants peuvent changer\ : .IP \- 3 l'état détaché ou non, puisqu'un thread fusionné peut s'être détaché lui\-même après sa création\ ; .IP \- la taille de la pile, que l'implémentation peut aligner sur une limite plus appropriée. .IP \- la taille de garde, que l'implémentation peut arrondir au multiple supérieur de la taille de page ou ignorer (c'est\-à\-dire, considérer qu'elle vaut 0) si l'application alloue sa propre pile. .PP De plus, si l'attribut contenant l'adresse de la pile n'était pas défini dans l'objet d'attributs de thread utilisé pour créer le thread, alors l'objet d'attributs de thread renvoyé contiendra l'adresse effective de la pile que l'implémentation a choisie pour le thread. .PP Quand l'objet d'attributs de thread renvoyé par \fBpthread_getattr_np\fP() n'est plus nécessaire, il devrait être détruit à l'aide de \fBpthread_attr_destroy\fP(3). .SH "VALEUR RENVOYÉE" En cas de réussite, cette fonction renvoie 0\ ; en cas d'erreur, elle renvoie un numéro d'erreur non nul. .SH ERREURS .TP \fBENOMEM\fP .\" Can happen (but unlikely) while trying to allocate memory for cpuset Mémoire insuffisante. .PP De plus, si \fIthread\fP se réfère au thread principal, alors \fBpthread_getattr_np\fP() peut échouer à cause d'erreurs de différents appels sous\-jacents\ : \fBfopen\fP(3) si \fI/proc/self/maps\fP ne peut être ouvert, et \fBgetrlimit\fP(2) si la limite de ressources \fBRLIMIT_STACK\fP n'est pas prise en charge. .SH ATTRIBUTS Pour une explication des termes utilisés dans cette section, consulter \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Interface Attribut Valeur T{ .na .nh \fBpthread_getattr_np\fP(). T} Sécurité des threads MT\-Safe .TE .sp 1 .SH STANDARDS GNU\ ; c'est la raison du suffixe «\ _np\ » (non portable) dans son nom. .SH HISTORIQUE glibc 2.2.3. .SH EXEMPLES Le programme ci\-dessous démontre l'utilisation de \fBpthread_getattr_np\fP(). Le programme crée un thread qui utilise ensuite \fBpthread_getattr_np\fP() pour récupérer et afficher les attributs contenant la taille de la garde, l'adresse de la pile et la taille de la pile. Des paramètres en ligne de commande peuvent être utilisés pour définir les attributs qui seront utilisés pour créer le thread à des valeurs autres que les valeurs par défaut. Les sessions d'interpréteur de commande ci\-dessous démontrent l'utilisation du programme. .PP Lors de la première exécution, sur un système x86\-32, un thread est créé en utilisant les attributs par défaut\ : .PP .in +4n .EX $\fB ulimit \-s\fP # Pas de limite de pile ==> taille de pile par défaut : 2 Mo unlimited $\fB ./a.out\fP Attributes of created thread: Guard size = 4096 bytes Stack address = 0x40196000 (EOS = 0x40397000) Stack size = 0x201000 (2101248) bytes .EE .in .PP Lors de l'exécution suivante, nous voyons que si la taille de la garde est fournie, elle est arrondie à la valeur supérieure du prochain multiple de la taille de page système (4096\ octets sous x86\-32)\ : .PP .in +4n .EX $\fB ./a.out \-g 4097\fP Thread attributes object after initializations: Guard size = 4097 bytes Stack address = (nil) Stack size = 0x0 (0) bytes \& Attributes of created thread: Guard size = 8192 bytes Stack address = 0x40196000 (EOS = 0x40397000) Stack size = 0x201000 (2101248) bytes .EE .in .\".in +4n .\".nf .\"$ ./a.out \-s 0x8000 .\"Thread attributes object after initializations: .\" Guard size = 4096 bytes .\" Stack address = 0xffff8000 (EOS = (nil)) .\" Stack size = 0x8000 (32768) bytes .\" .\"Attributes of created thread: .\" Guard size = 4096 bytes .\" Stack address = 0x4001e000 (EOS = 0x40026000) .\" Stack size = 0x8000 (32768) bytes .\".fi .\".in .PP Lors de la dernière exécution, le programme alloue manuellement une pile pour le thread. Dans ce cas, l'attribut contenant la taille de la garde est ignoré. .PP .in +4n .EX $\fB ./a.out \-g 4096 \-s 0x8000 \-a\fP Allocated thread stack at 0x804d000 \& Thread attributes object after initializations: Guard size = 4096 bytes Stack address = 0x804d000 (EOS = 0x8055000) Stack size = 0x8000 (32768) bytes \& Attributes of created thread: Guard size = 0 bytes Stack address = 0x804d000 (EOS = 0x8055000) Stack size = 0x8000 (32768) bytes .EE .in .SS "Source du programme" .\" SRC BEGIN (pthread_getattr_np.c) \& .EX #define _GNU_SOURCE /* Pour la déclaration de pthread_getattr_np() */ #include #include #include #include #include #include \& static void display_stack_related_attributes(pthread_attr_t *attr, char *prefix) { int s; size_t stack_size, guard_size; void *stack_addr; \& s = pthread_attr_getguardsize(attr, &guard_size); if (s != 0) errc(EXIT_FAILURE, s, "pthread_attr_getguardsize"); printf("%sGuard size = %zu bytes\en", prefix, guard_size); \& s = pthread_attr_getstack(attr, &stack_addr, &stack_size); if (s != 0) errc(EXIT_FAILURE, s, "pthread_attr_getstack"); printf("%sStack address = %p", prefix, stack_addr); if (stack_size > 0) printf(" (EOS = %p)", (char *) stack_addr + stack_size); printf("\en"); printf("%sStack size = %#zx (%zu) bytes\en", prefix, stack_size, stack_size); } \& static void display_thread_attributes(pthread_t thread, char *prefix) { int s; pthread_attr_t attr; \& s = pthread_getattr_np(thread, &attr); if (s != 0) errc(EXIT_FAILURE, s, "pthread_getattr_np"); \& display_stack_related_attributes(&attr, prefix); \& s = pthread_attr_destroy(&attr); if (s != 0) errc(EXIT_FAILURE, s, "pthread_attr_destroy"); } \& static void * /* Démarrage de la fonction pour le thread créé */ thread_start(void *arg) { printf("Attributes of created thread:\en"); display_thread_attributes(pthread_self(), "\et"); \& exit(EXIT_SUCCESS); /* Termine tous les threads */ } \& static void usage(char *pname, char *msg) { if (msg != NULL) fputs(msg, stderr); fprintf(stderr, "Usage: %s [\-s stack\-size [\-a]]" " [\-g guard\-size]\en", pname); fprintf(stderr, "\et\et\-a means program should allocate stack\en"); exit(EXIT_FAILURE); } \& static pthread_attr_t * /* Obtenir les attributs de thread en ligne de commande */ get_thread_attributes_from_cl(int argc, char *argv[], pthread_attr_t *attrp) { int s, opt, allocate_stack; size_t stack_size, guard_size; void *stack_addr; pthread_attr_t *ret_attrp = NULL; /* Définir à attrp si un objet d'attributs de thread est initialisé */ allocate_stack = 0; stack_size = \-1; guard_size = \-1; \& while ((opt = getopt(argc, argv, "ag:s:")) != \-1) { switch (opt) { case \[aq]a\[aq]: allocate_stack = 1; break; case \[aq]g\[aq]: guard_size = strtoul(optarg, NULL, 0); break; case \[aq]s\[aq]: stack_size = strtoul(optarg, NULL, 0); break; default: usage(argv[0], NULL); } } \& if (allocate_stack && stack_size == \-1) usage(argv[0], "Specifying \-a without \-s makes no sense\en"); \& if (argc > optind) usage(argv[0], "Extraneous command\-line arguments\en"); \& if (stack_size >= 0 || guard_size > 0) { ret_attrp = attrp; \& s = pthread_attr_init(attrp); if (s != 0) errc(EXIT_FAILURE, s, "pthread_attr_init"); } \& if (stack_size >= 0) { if (!allocate_stack) { s = pthread_attr_setstacksize(attrp, stack_size); if (s != 0) errc(EXIT_FAILURE, s, "pthread_attr_setstacksize"); } else { s = posix_memalign(&stack_addr, sysconf(_SC_PAGESIZE), stack_size); if (s != 0) errc(EXIT_FAILURE, s, "posix_memalign"); printf("Allocated thread stack at %p\en\en", stack_addr); \& s = pthread_attr_setstack(attrp, stack_addr, stack_size); if (s != 0) errc(EXIT_FAILURE, s, "pthread_attr_setstacksize"); } } \& if (guard_size >= 0) { s = pthread_attr_setguardsize(attrp, guard_size); if (s != 0) errc(EXIT_FAILURE, s, "pthread_attr_setstacksize"); } \& return ret_attrp; } \& int main(int argc, char *argv[]) { int s; pthread_t thr; pthread_attr_t attr; pthread_attr_t *attrp = NULL; /* Définir à &attr si un objet d'attributs de thread est initialisé */ \& attrp = get_thread_attributes_from_cl(argc, argv, &attr); \& if (attrp != NULL) { printf("Thread attributes object after initializations:\en"); display_stack_related_attributes(attrp, "\et"); printf("\en"); } \& s = pthread_create(&thr, attrp, &thread_start, NULL); if (s != 0) errc(EXIT_FAILURE, s, "pthread_create"); \& if (attrp != NULL) { s = pthread_attr_destroy(attrp); if (s != 0) errc(EXIT_FAILURE, s, "pthread_attr_destroy"); } \& pause(); /* Termine quand un autre thread appelle exit() */ } .EE .\" SRC END .SH "VOIR AUSSI" .ad l .nh \fBpthread_attr_getaffinity_np\fP(3), \fBpthread_attr_getdetachstate\fP(3), \fBpthread_attr_getguardsize\fP(3), \fBpthread_attr_getinheritsched\fP(3), \fBpthread_attr_getschedparam\fP(3), \fBpthread_attr_getschedpolicy\fP(3), \fBpthread_attr_getscope\fP(3), \fBpthread_attr_getstack\fP(3), \fBpthread_attr_getstackaddr\fP(3), \fBpthread_attr_getstacksize\fP(3), \fBpthread_attr_init\fP(3), \fBpthread_create\fP(3), \fBpthreads\fP(7) .PP .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot , Frédéric Hantrais et Jean-Pierre Giraud . .PP Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. .PP Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .