Изменить размер выделенной памяти под сегмент данных вызывающего процесса
#include <unistd.h>int brk( void *endds );
libc
Функция brk() динамически изменяет количество памяти для использования сегментом данных (см. функции exec*() ).
Изменение осуществляется путем сброса значения прерывания процесса и выделения соответствующего объема пространства. Значение прерывания - это адрес первого вхождения за концом сегмента данных. Объем выделенного пространства увеличивается с увеличением значения прерывания. Вновь выделенное пространство обнуляется. Однако если одна и та же область памяти перераспределяется одному и тому же процессу, её содержимое не определено.
Когда программа начинает выполнение с использованием execve(), прерывание устанавливается в наивысшей локации, определяемой областями хранения программы и данных.
Можно вызвать getrlimit(), чтобы определить максимально допустимый размер сегмента данных; невозможно установить разрыв за пределами значения rlim_max, возвращаемого из getrlimit(), то есть:
end + rlim.rlim_max
Legacy Unix
Не рекомендуется использовать brk() и sbrk() с любыми другими функциями памяти (такими как malloc(), mmap() и free()). Функция brk() предполагает, что куча непрерывна; в ЗОСРВ «Нейтрино» память возвращается системе из кучи, в результате чего куча становится разреженной. Функция ЗОСРВ «Нейтрино» malloc() основана на mmap(), а не на brk().
Функция brk() использовалась в особых случаях, когда никакая другая функция распределения памяти не предоставляла такую возможность. Вместо этого используйте mmap(), потому что её можно переносимо использовать со всеми другими функциями распределения памяти и с любой функцией, которая использует другие функции распределения.
Значение аргумента brk() округляется в большую сторону для выравнивания с восьмибайтовыми границами.
_btext, _edata, _end, _etext, sbrk(), execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe(), free(), getrlimit(), malloc(), mmap()
Предыдущий раздел: Описание API системной библиотеки