Provided by: manpages-ru-dev_4.27.0-1_all 

НАИМЕНОВАНИЕ
malloc_info - экспортирует состояние malloc в поток
БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)
ОБЗОР
#include <malloc.h>
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 ============
<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>
============ After allocating blocks ============
<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>
Исходный код программы
#include <err.h>
#include <errno.h>
#include <malloc.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
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 <aereiae@gmail.com>, Alexey
<a.chepugov@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>,
Dmitry Bolkhovskikh <d20052005@yandex.ru>, ITriskTI <ITriskTI@gmail.com>, Max Is <ismax799@gmail.com>,
Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com>, Малянов Евгений Викторович
<maljanow@outlook.com> и Kirill Rekhov <krekhov.dev@gmail.com>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной
лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или
более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских
переводчиков.
Справочные страницы Linux 6.9.1 15 июня 2024 г. malloc_info(3)