malloc_info(3) Library Functions Manual malloc_info(3) malloc_info - malloc C (libc, -lc) #include int malloc_info(int options, FILE *stream); malloc_info() XML, . stream. (arenas) ( malloc(3)). options . On success, malloc_info() returns 0. On failure, it returns -1, and errno is set to indicate the error. EINVAL options . attributes(7). +----------------------------+----------------------------------------------------------+--------------------------+ | | | | +----------------------------+----------------------------------------------------------+--------------------------+ |malloc_info() | | MT-Safe | +----------------------------+----------------------------------------------------------+--------------------------+ GNU. glibc 2.10. XML ( C), ( ). XML . malloc_info() , open_memstream(3). malloc_info() malloc_stats(3) mallinfo(3). , , , . , . , , , . . , , , . malloc_info(). . , . 10000 . , , malloc_info() . $ getconf GNU_LIBC_VERSION glibc 2.13 $ ./a.out 1 10000 100 ============ Before allocating blocks ============ ============ After allocating blocks ============ #include #include #include #include #include #include static size_t blockSize; static size_t numThreads; static unsigned int numBlocks; static void * thread_func(void *arg) { int tn = (int) arg; /* The multiplier '(2 + tn)' ensures that each thread (including the main thread) allocates a different amount of memory. */ for (unsigned int j = 0; j < numBlocks; j++) if (malloc(blockSize * (2 + tn)) == NULL) err(EXIT_FAILURE, "malloc-thread"); sleep(100); /* Sleep until main thread terminates. */ return NULL; } int main(int argc, char *argv[]) { int sleepTime; pthread_t *thr; if (argc < 4) { fprintf(stderr, "%s num-threads num-blocks block-size [sleep-time]\n", argv[0]); exit(EXIT_FAILURE); } numThreads = atoi(argv[1]); numBlocks = atoi(argv[2]); blockSize = atoi(argv[3]); sleepTime = (argc > 4) ? atoi(argv[4]) : 0; thr = calloc(numThreads, sizeof(*thr)); if (thr == NULL) err(EXIT_FAILURE, "calloc"); printf("============ Before allocating blocks ============\n"); malloc_info(0, stdout); /* Create threads that allocate different amounts of memory. */ 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"); /* If we add a sleep interval after the start-up of each thread, the threads likely won't contend for malloc mutexes, and therefore additional arenas won't be allocated (see malloc(3)). */ if (sleepTime > 0) sleep(sleepTime); } /* The main thread also allocates some memory. */ for (unsigned int j = 0; j < numBlocks; j++) if (malloc(blockSize) == NULL) err(EXIT_FAILURE, "malloc"); sleep(2); /* Give all threads a chance to complete allocations. */ printf("\n============ After allocating blocks ============\n"); malloc_info(0, stdout); exit(EXIT_SUCCESS); } mallinfo(3), malloc(3), malloc_stats(3), mallopt(3), open_memstream(3) () aereiae , Alexey , Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , ITriskTI , Max Is , Yuri Kozlov , , Kirill Rekhov ; GNU (GNU General Public License - GPL, 3 ) , - . - , , () () () <>. Linux 6.9.1 15 2024 . malloc_info(3)