Provided by: manpages-fr-dev_4.21.0-2_all bug

NOM

       malloc_info - Exporter l'état de malloc vers un flux

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <malloc.h>

       int malloc_info(int options, FILE *stream);

DESCRIPTION

       La  fonction  malloc_info()  exporte  une chaîne XML décrivant l'état actuel de l'allocation mémoire pour
       l'appelant. Cette chaîne est écrite dans le flux stream. La chaîne  exportée  contient  des  informations
       concernant toutes les domaines de mémoires (« arenas », consultez malloc(3)).

       Dans la mise en œuvre actuelle, le paramètre options doit être nul.

VALEUR RENVOYÉE

       En  cas  de  succès,  malloc_info()  renvoie 0. En cas d'erreur, -1 est renvoyé et errno contient le code
       d'erreur.

ERREURS

       EINVAL Le paramètre options n'était pas nul.

VERSIONS

       malloc_info() a été ajoutée dans la glibc 2.10.

ATTRIBUTS

       Pour une explication des termes utilisés dans cette section, consulter attributes(7).
       ┌──────────────────────────────────────────────────────────────────────┬──────────────────────┬─────────┐
       │ InterfaceAttributValeur  │
       ├──────────────────────────────────────────────────────────────────────┼──────────────────────┼─────────┤
       │ malloc_info()                                                        │ Sécurité des threads │ MT-Safe │
       └──────────────────────────────────────────────────────────────────────┴──────────────────────┴─────────┘

STANDARDS

       Cette fonction est une extension GNU.

NOTES

       L'information d'allocation mémoire est fournie sous forme de flux XML (plutôt que  de  structure C),  car
       les  informations fournies pourront évoluer dans le futur, en raison de modifications dans le code mis en
       œuvre. La sortie XML comporte un champ de version.

       La fonction open_memstream(3) peut être utilisée pour envoyer la sortie de malloc_info() directement dans
       un tampon en mémoire plutôt que dans un fichier.

       La fonction malloc_info() est conçue pour combler les manques de malloc_stats(3) et mallinfo(3).

EXEMPLES

       Le programme ci-dessous accepte jusqu'à quatre paramètres en ligne de commande dont  les  trois  premiers
       sont  obligatoires.  Le premier paramètre indique le nombre de processus légers (« threads ») que le pro‐
       gramme doit créer. Tous les threads, thread principal compris, allouent le nombre de blocs de mémoire in‐
       diqué en deuxième paramètre. Le troisième paramètre contrôle la taille des blocs  à  allouer.  Le  thread
       principal  crée des blocs de cette taille, le deuxième thread créé par le programme alloue des blocs deux
       fois plus grands, le troisième thread alloue des blocs trois fois plus grands et ainsi de suite.

       Le programme appelle malloc_info() deux fois pour afficher l'état de l'allocation mémoire. Le premier ap‐
       pel est effectué avant la création d’un thread ou l'allocation de mémoire. Le deuxième appel est effectué
       une fois que tous les threads ont alloué de la mémoire.

       Dans l'exemple  suivant,  les  paramètres  commandent  la  création  d'un  thread  additionnel,  allouant
       10 000 blocs  de mémoire, comme le thread principal. Une fois les blocs de mémoire alloués, malloc_info()
       affiche l'état des deux domaines de mémoire.

           $ getconf GNU_LIBC_VERSION
           glibc 2.13
           $ ./a.out 1 10000 100
           ============ Avant allocation des blocs ============
           <malloc version="1">
           <heap nr="0">
           <sizes>
           </sizes>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="135168"/>
           <system type="max" size="135168"/>
           <aspace type="total" size="135168"/>
           <aspace type="mprotect" size="135168"/>
           </heap>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="135168"/>
           <system type="max" size="135168"/>
           <aspace type="total" size="135168"/>
           <aspace type="mprotect" size="135168"/>
           </malloc>

           ============ Après allocation des blocs ============
           <malloc version="1">
           <heap nr="0">
           <sizes>
           </sizes>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="1081344"/>
           <system type="max" size="1081344"/>
           <aspace type="total" size="1081344"/>
           <aspace type="mprotect" size="1081344"/>
           </heap>
           <heap nr="1">
           <sizes>
           </sizes>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="1032192"/>
           <system type="max" size="1032192"/>
           <aspace type="total" size="1032192"/>
           <aspace type="mprotect" size="1032192"/>
           </heap>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="2113536"/>
           <system type="max" size="2113536"/>
           <aspace type="total" size="2113536"/>
           <aspace type="mprotect" size="2113536"/>
           </malloc>

   Source du programme
       #include <err.h>
       #include <errno.h>
       #include <malloc.h>
       #include <pthread.h>
       #include <stdlib.h>
       #include <unistd.h>

       static size_t        tailleBloc;
       static size_t        numThreads;
       static unsigned int  numBlocks;

       static void *
       thread_func(void *arg)
       {
           int tn = (int) arg;

           /* Le multiplicateur '(2 + tn)' assure que chaque thread (dont
              le thread principal) alloue une quantité de mémoire différente. */

           for (unsigned int j = 0; j < numBlocks; j++)
               if (malloc(blockSize * (2 + tn)) == NULL)
                   err(EXIT_FAILURE, "malloc-thread");

           sleep(100);         /* Attendre que le thread principal se termine. */
           return NULL;
       }

       int
       main(int argc, char *argv[])
       {
           int        tpsSommeil;
           pthread_t  *thr;

           if (argc < 4) {
               fprintf(stderr,
                       "%s nb-threads nb-blocs taille-bloc [tps-sommeil]\n",
                       argv[0]);
               exit(EXIT_FAILURE);
           }

           nbThreads = atoi(argv[1]);
           nbBlocs = atoi(argv[2]);
           tailleBloc = atoi(argv[3]);
           tpsSommeil = (argc > 4) ? atoi(argv[4]) : 0;

           thr = calloc(numThreads, sizeof(*thr));
           if (thr == NULL)
               err(EXIT_FAILURE, "calloc");

           printf("============ Avant allocation des blocs ============\n");
           malloc_info(0, stdout);

           /* Créer les threads allouant des quantités de mémoire différentes. */

           for (size_t tn = 0; tn < numThreads; tn++) {
               errno = pthread_create(&thr[tn], NULL, thread_func,
                                      (void *) tn);
               if (errno != 0)
                   err(EXIT_FAILURE, "pthread_create");

               /* Si un intervalle de sommeil existe après le démarrage de
                  chaque thread, les threads ne vont sans doute pas se battre
                  pour les mutex malloc et par conséquent les domaines de mémoire
                  supplémentaires ne seront pas alloués (consultez malloc(3)).
                  */

               if (tpsSommeil > 0)
                   sleep(tpsSommeil);
           }

           /* Le thread principal alloue également de la mémoire. */

           for (unsigned int j = 0; j < numBlocks; j++)
               if (malloc(blockSize) == NULL)
                   err(EXIT_FAILURE, "malloc");

           sleep(2);           /* Donner à tous les threads une chance
                                  de terminer les allocations. */

           printf("\n============ Après allocation des blocs ============\n");
           malloc_info(0, stdout);

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       mallinfo(3), malloc(3), malloc_stats(3), mallopt(3), open_memstream(3)

TRADUCTION

       La  traduction  française   de   cette   page   de   manuel   a   été   créée   par   Christophe   Blaess
       <https://www.blaess.fr/christophe/>,  Stéphan  Rafin  <stephan.rafin@laposte.net>,  Thierry Vignaud <tvi‐
       gnaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe  Guérard  <fe‐
       vrier@tigreraye.org>,  Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@de‐
       bian.org>,  Thomas  Huriaux  <thomas.huriaux@gmail.com>,   Nicolas   François   <nicolas.francois@centra‐
       liens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
       Denis  Barbier  <barbier@debian.org>,  David  Prévot <david@tilapin.org> et Grégoire Scano <gregoire.sca‐
       no@malloc.fr>

       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 à de‐
       bian-l10n-french@lists.debian.org.

Pages du manuel de Linux 6.03                    5 février 2023                                   malloc_info(3)