sbrk()

Изменить размер адресного пространства процесса

Прототип:

#include <unistd.h>
void * sbrk( int increment );

Аргументы:

increment
Величина инкримента текущего значения прерывания. Может быть положительной или отрицательной.

Библиотека:

libc

Описание:

Значение прерывания - это адрес первого байта нераспределенной памяти. Когда программа начинает выполнение, значение прерывания помещается после кода и константных данных для программы. По мере выделения памяти этот указатель продвигается вперед, когда нет достаточно большого свободного блока, чтобы запрос на выделение был выполнен. Функция sbrk() устанавливает новое значение прерывания для программы, добавляя значение приращения increment к текущему значению прерывания. Недавно выделенная область будет обнулена.

Переменная _amblksiz (определенная в <stdlib.h>) содержит приращение по умолчанию. Это значение может быть изменено программой в любое время.

Возвращаемое значение:

Указатель на начало нового блока памяти. Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

EAGAIN
Общий объем системной памяти, доступной для выделения этому процессу, временно недостаточен. Это может произойти даже при условии, что запрошенное пространство меньше максимального размера сегмента данных.
ENOMEM
Для запрошенного изменения выделено больше места, чем доступно, или был вызван конфликт выделения памяти.

Примеры:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define alloc( x, y ) y = sbrk( x );
int main( void )
{
void *brk;
brk = sbrk( 0x3100 );
printf( "New break value after sbrk( 0x3100 ) \t%p\n", brk );
brk = sbrk( 0x0200 );
printf( "New break value after sbrk( 0x0200 ) \t%p\n", brk );
return (EXIT_SUCCESS);
}

Классификация:

Legacy Unix

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Предостережения:

Не рекомендуется использовать brk() и sbrk() с любыми другими функциями памяти (такими как malloc(), mmap() и free()). Функция brk() предполагает, что куча является непрерывной; в ЗОСРВ «Нейтрино» память возвращается системе из кучи, в результате чего куча становится разреженной. Функция malloc() основана на mmap(), а не на brk().

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

Значение аргумента sbrk() округляется в большую сторону для выравнивания с 8-байтовыми границами.

Тематические ссылки:

_amblksiz, brk(), _btext, calloc(), _edata, _end, errno, _etext, free(), malloc(), mmap(), realloc()




Предыдущий раздел: Описание API системной библиотеки