BRK(2) | Руководство программиста Linux | BRK(2) |
brk, sbrk - изменяет размер сегмента данных
#include <unistd.h>
int brk(void *addr);
void *sbrk(intptr_t increment);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
brk(), sbrk():
_DEFAULT_SOURCE || (_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200112L)
_BSD_SOURCE || _SVID_SOURCE || (_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200112L)
Вызов brk() и sbrk() изменяет расположение маркера окончания программы (program break), который определяет конец сегмента данных процесса (т.е., маркер окончания — это первая точка после конца сегмента неинициализированных данных). Увеличение маркера окончания программы позволяет процессу выделить память; уменьшение маркера приводит к освобождению памяти.
brk() устанавливает конец сегмента данных в значение, указанное в аргументе addr, если это значение является приемлемым, система имеет достаточно памяти и процесс не достиг максимально возможного размера своего сегмента данных (см. setrlimit(2)).
sbrk() увеличивает пространство данных программы на increment байт. Вызов sbrk() с increment равным 0 может быть использован для нахождения текущего местоположения маркера окончания программы.
При успешном выполнении brk() возвращает ноль. В случае ошибки возвращается -1, а errno становится равной ENOMEM.
При успешном выполнении sbrk() возвращает предыдущий маркер окончания программы. Если маркер окончания был увеличен, то это значение указывает на начало новой выделенной памяти. В случае ошибки возвращается (void *) -1, а errno становится равной ENOMEM.
4.3BSD; SUSv1, помечены как УСТАРЕВШИЕ в SUSv2, удалены из POSIX.1-2001.
Не используйте brk() и sbrk(): для выделения памяти функции malloc(3) являются более переносимыми и удобными.
В различных системах используются различные типы для аргумента sbrk(). Обычно это int, ssize_t, ptrdiff_t, intptr_t.
Возвращаемое brk() значение, описанное выше, является частью поведения обёрточной функции glibc к системному вызову Linux brk(). В большинстве других реализаций возвращаемое brk() значение то же самое; это значение также описано в SUSv2. Однако, реальный системный вызов Linux в случае успешного завершения возвращает новый маркер окончания программы. При ошибке системный вызов возвращает текущий маркер окончания. Обёрточная функция glibc делает то же самое (т. е., проверяет меньше ли новый маркер чем addr), возвращая значения 0 и -1, как описано выше.
В Linux, вызов sbrk() реализован в виде библиотечной функции, которая использует системный вызов brk() и ведёт внутренний учёт для возврата старого значения маркера окончания.
2016-03-15 | Linux |