SBRK(2)

NAME
sbrk - change data segment size (obsolete)

LIBRARY
libc

SYNOPSIS
#include <sys/types.h>
#include <unistd.h>
void *
sbrk(intptr_t incr);

DESCRIPTION
The sbrk() function is a legacy interface from before the advent of modern virtual memory management. sbrk() has only limited functionality due to having to play nice with modern system calls such as mmap(2).

The sbrk() function is used to change the amount of memory allocated in a process's data segment. It does this by moving the location of the “break”. The break is the first address after the end of the process's uninitialized data segment (also known as the “BSS”).

The break range is limited by the RLIMIT_DATA resource limit applied to the process.

The sbrk() function raises the break by incr bytes, returning a pointer to the base of the new memory. Any attempt to lower the break point will return (void *)-1 and set errno to EOPNOTSUPP.

NOTES
While the actual process data segment size maintained by the kernel will only grow or shrink in page sizes, this function allows setting the break to unaligned values (i.e., it may point to any address inside the last page of the data segment).

The current value of the program break may be determined by calling sbrk(0).

The sbrk() function is thread-safe. See also end(3).

The getrlimit(2) system call may be used to determine the maximum permissible size of the data segment. It will not be possible to set the break beyond “etext + rlim.rlim_max” where the rlim.rlim_max value is returned from a call to getrlimit(RLIMIT_DATA, &rlim). (See end(3) for the definition of etext).

RETURN VALUES
The sbrk() function returns the prior break pointer if successful; otherwise the value (void *)-1 is returned and the global variable errno is set to indicate the error.

ERRORS
sbrk() will fail if:

[EINVAL]
    The requested break value was beyond the beginning of the data segment.

[ENOMEM]
    The data segment size limit, as set by setrlimit(2), was exceeded.

[ENOMEM]
    Insufficient space existed in the swap area to support the expansion of the data segment.

[EOPNOTSUPP]
    An attempt has been made to perform an action that is no longer supported by this function.

SEE ALSO
execve(2), getrlimit(2), mmap(2), end(3), free(3), malloc(3)

BUGS
Mixing sbrk() with malloc(3), free(3), or similar functions will result in non-portable program behavior.

Setting the break may fail due to a temporary lack of swap space. It is not possible to distinguish this from a failure caused by exceeding the maximum size of the data segment without consulting getrlimit(2).