brk и sbrk - это базовые системные вызовы управления памятью , используемые в Unix и Unix-подобных операционных системах. для управления объемом памяти, выделенной для сегмента данных процесса процесса. Эти функции обычно вызываются из функции библиотеки управления памятью более высокого уровня, такой как malloc. В исходной системе Unix brk и sbrk были единственными способами, с помощью которых приложения могли получить дополнительное пространство данных; в более поздних версиях это также можно было сделать с помощью вызова mmap.
Вызовы brk и sbrk динамически изменяют объем пространства, выделенного для сегмента данных вызывающего процесса. Изменение осуществляется путем сброса прерывания программы процесса, которое определяет максимальное пространство, которое может быть выделено. Разрыв программы - это адрес первого места за текущим концом области данных. Объем доступного пространства увеличивается с увеличением значения разрыва. Доступное пространство инициализируется нулевым значением, если разрыв не уменьшается, а затем увеличивается, поскольку он может повторно использовать те же страницы каким-либо неопределенным образом. Значение разрыва может автоматически округляться до размера, подходящего для архитектуры управления памятью.
sbrk и brk считаются устаревшими даже по стандартам 1997 года (Single UNIX Specification v2 или POSIX.1-1998). Они были удалены в POSIX.1-2001.
#includeint brk (void * end_data_segment); void * sbrk (приращение intptr_t);
sbrk используется для настройки значения прерывания программы путем добавления возможного отрицательного размера, а brk используется для установки значения прерывания в значение указателя. Установите параметр incrementна ноль, чтобы получить текущее значение прерывания программы.
После успешного завершения подпрограмма brk возвращает значение 0, а подпрограмма sbrk возвращает предыдущее значение прерывания программы (если доступное пространство увеличивается, то это предыдущее значение также указывает к началу нового участка). Если одна из подпрограмм завершилась неудачно, возвращается значение −1, а глобальная переменная errno устанавливается для указания ошибки.
Не каждая Unix-подобная система поддерживает идею о том, что пользователь может управлять сегментом данных. Mac OS X реализация sbrk является эмуляцией и имеет максимальное выделение 4 мегабайта. При первом вызове для моделирования сегмента выделяется именно такая большая область. Когда этот предел достигнут, возвращается -1, а для ошибки устанавливается значение ENOMEM. brk всегда вызывает ошибку.
установлена ошибка ENOMEM, и выделенное пространство остается неизменным, если выполняется одно или несколько из следующих условий: