brk()

Изменить размер выделенной памяти под сегмент данных вызывающего процесса

Прототип:

#include <unistd.h>
int brk( void *endds );

Аргументы:

endds
Указатель на конец сегмента данных.

Библиотека:

libc

Описание:

Функция brk() динамически изменяет количество памяти для использования сегментом данных (см. функции exec*() ).

Изменение осуществляется путем сброса значения прерывания процесса и выделения соответствующего объема пространства. Значение прерывания - это адрес первого вхождения за концом сегмента данных. Объем выделенного пространства увеличивается с увеличением значения прерывания. Вновь выделенное пространство обнуляется. Однако если одна и та же область памяти перераспределяется одному и тому же процессу, её содержимое не определено.

Когда программа начинает выполнение с использованием execve(), прерывание устанавливается в наивысшей локации, определяемой областями хранения программы и данных.

Можно вызвать getrlimit(), чтобы определить максимально допустимый размер сегмента данных; невозможно установить разрыв за пределами значения rlim_max, возвращаемого из getrlimit(), то есть:

end + rlim.rlim_max

Возвращаемое значение:

0
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

ENOMEM
Это может означать:
EAGAIN
Общий объем доступной системной памяти временно недостаточен. Это может произойти, даже если запрошенное пространство меньше максимального размера сегмента данных.

Классификация:

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 системной библиотеки