BRK(2)

ИМЯ
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(). Обычно это int, ssize_t, ptrdiff_t, intptr_t.

  Отличия между библиотекой C и ядром
Возвращаемое brk() значение, описанное выше, является частью поведения обёрточной функции glibc к системному вызову Linux brk(). В большинстве других реализаций возвращаемое brk() значение то же самое; это значение также описано в SUSv2. Однако, реальный системный вызов Linux в случае успешного завершения возвращает новый маркер окончания программы. При ошибке системный вызов возвращает текущий маркер окончания. Обёрточная функция glibc делает то же самое (т. е., проверяет меньше ли новый маркер чем addr), возвращая значения 0 и -1, как описано выше.

В Linux, вызов sbrk() реализован в виде библиотечной функции, которая использует системный вызов brk() и ведёт внутренний учёт для возврата старого значения маркера окончания.

СМОТРИТЕ ТАКЖЕ
execve(2), getrlimit(2), end(3), malloc(3)