ИМЯ brk, sbrk - изменяет размер сегмента данных
ОБЗОР #include <unistd.h>
int brk(void *addr);
void *sbrk(intptr_t increment);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
brk(), sbrk(): Начиная с glibc 2.19: _DEFAULT_SOURCE || (_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200112L) В glibc с 2.12 по 2.19: _BSD_SOURCE || _SVID_SOURCE || (_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200112L) До glibc 2.12: _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500
ОПИСАНИЕ Вызов 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(). Обычно это меньше ли новый маркер чем addr), возвращая значения 0 и -1, как описано выше.
В Linux, вызов sbrk() реализован в виде библиотечной функции, которая использует системный вызов brk() и ведёт внутренний учёт для возврата старого значения маркера окончания.
СМОТРИТЕ ТАКЖЕ execve(2), getrlimit(2), end(3), malloc(3)
|