.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (c) 2012 by Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH malloc_info 3 "31 октября 2023 г." "Linux man\-pages 6.06" .SH ИМЯ malloc_info \- экспортирует состояние malloc в поток .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP .P \fBint malloc_info(int \fP\fIoptions\fP\fB, FILE *\fP\fIstream\fP\fB);\fP .fi .SH ОПИСАНИЕ Функция \fBmalloc_info\fP() экспортирует строку XML, описывающую текущее состояние реализации выделения памяти вызывающего. Строка печатается в файловый поток \fIstream\fP. В экспортируемой строке содержится информация о всех областях (arenas) (смотрите \fBmalloc\fP(3)). .P В текущей реализации значение \fIoptions\fP должно быть равно нулю. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" On success, \fBmalloc_info\fP() returns 0. On failure, it returns \-1, and \fIerrno\fP is set to indicate the error. .SH ОШИБКИ .TP \fBEINVAL\fP Значение \fIoptions\fP не равно. .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ .na .nh \fBmalloc_info\fP() T} Безвредность в нитях MT\-Safe .TE .SH СТАНДАРТЫ GNU. .SH ИСТОРИЯ glibc 2.10. .SH ЗАМЕЧАНИЯ Информация о выделении памяти предоставляется в виде строки XML (а не в структуре C), так как структура со временем может меняться (при изменении в реализации). Возвращаемая строка XML содержит поле версии. .P Для отправки вывода \fBmalloc_info\fP() в буфер памяти, а не в файл можно использовать функцию \fBopen_memstream\fP(3). .P Функция \fBmalloc_info\fP() разработана для компенсации нехватки данных из \fBmalloc_stats\fP(3) и \fBmallinfo\fP(3). .SH ПРИМЕРЫ Программа, представленная ниже, принимает до четырёх параметров командной строки, три из которых обязательны. В первом параметре задаётся количество нитей, которые должна создать программа. Все нити, включая главную нить, выделяют количество блоков памяти, заданное в втором параметре. В третьем параметре задаётся размер выделяемых блоков. Главная нить создает блоки этого размера, вторая нить создаваемая программой, выделяет блоки двукратного размера, третья нить выделяет блоки трёхкратного размера и так далее. .P Чтобы показать состояние выделения памяти программа дважды вызывает \fBmalloc_info\fP(). Первый раз вызов делается до создания нитей и выделения памяти. Второй вызов выполняется после того, как все нити выделят память. .P В следующем примере аргументами командной строки задаётся создание одной дополнительной нити и что главная и дополнительная нить выделяют 10000 блоков памяти. После того, как блоки памяти выделены, \fBmalloc_info\fP() показывает состояние двух областей выделения. .P .in +4n .EX $ \fBgetconf GNU_LIBC_VERSION\fP glibc 2.13 $ \fB./a.out 1 10000 100\fP ============ Before allocating blocks ============ \& ============ After allocating blocks ============ .EE .in .SS "Исходный код программы" .\" [[memory leak]] SRC BEGIN (malloc_info.c) .EX #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 \[aq](2 + tn)\[aq] 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]\en", 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 ============\en"); 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\[aq]t contend for malloc mutexes, and therefore additional arenas won\[aq]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("\en============ After allocating blocks ============\en"); malloc_info(0, stdout); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "СМ. ТАКЖЕ" \fBmallinfo\fP(3), \fBmalloc\fP(3), \fBmalloc_stats\fP(3), \fBmallopt\fP(3), \fBopen_memstream\fP(3) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Alexey , Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , ITriskTI , Max Is , Yuri Kozlov , Иван Павлов и Малянов Евгений Викторович . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .