table of contents
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():
- Начиная с glibc 2.12:
-
_BSD_SOURCE || _SVID_SOURCE ||
(_XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&
!(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) -
До glibc 2.12: _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500 || - _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
ОПИСАНИЕ¶
Вызов brk() и sbrk() изменяет расположение маркера окончания программы (program break), который определяет конец сегмента данных процесса (т.е., маркер окончания — это первая точка после конца сегмента неинициализированных данных). Увеличение маркера окончания программы позволяет процессу выделить память; уменьшение маркера приводит к освобождению памяти.
brk() устанавливает конец сегмента данных в значение, указанное в аргументе addr, если это значение является приемлемым, система имеет достаточно памяти и процесс не достиг максимально возможного размера своего сегмента данных (см. setrlimit(2)).
sbrk() увеличивает пространство данных программы на increment байт. Вызов sbrk() с increment равным 0 может быть использован для нахождения текущего местоположения маркера окончания программы.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
При успешном выполнении brk() возвращает ноль. В случае ошибки возвращается -1, а errno становится равной ENOMEM (но см. Замечания, касающиеся Linux далее).
При успешном выполнении sbrk() возвращает предыдущий маркер окончания программы. Если маркер окончания был увеличен, то это значение указывает на начало новой выделенной памяти. В случае ошибки возвращается (void *) -1, а errno становится равной ENOMEM.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
4.3BSD; SUSv1, помечены как УСТАРЕВШИЕ в SUSv2, удалены из POSIX.1-2001.
ЗАМЕЧАНИЯ¶
Не используйте brk() и sbrk(): для выделения памяти функции malloc(3) являются более переносимыми и удобными.
В различных системах используются различные типы для аргумента sbrk(). Обычно это int, ssize_t, ptrdiff_t, intptr_t.
Замечания, касающиеся Linux¶
Возвращаемое brk() значение, описанное выше, является частью поведения обёрточной функции glibc к системному вызову Linux brk(). В большинстве других реализаций возвращаемое brk() значение то же самое; это значение также описано в SUSv2. Однако, реальный системный вызов Linux в случае успешного завершения возвращает новый маркер окончания программы. При ошибке системный вызов возвращает текущий маркер окончания. Обёрточная функция glibc делает то же самое (т. е., проверяет меньше ли новый маркер чем addr), возвращая значения 0 и -1, как описано выше.
В Linux, вызов sbrk() реализован в виде библиотечной функции, которая использует системный вызов brk() и ведёт внутренний учёт для возврата старого значения маркера окончания.
СМОТРИТЕ ТАКЖЕ¶
2010-09-20 | Linux |