BRK(2) | System Calls Manual | BRK(2)

# NAME

`brk`, `sbrk` — change data segment size

# SYNOPSIS

`#include <unistd.h>`

int
`brk`(void *addr);

void *
`sbrk`(int incr);

# DESCRIPTION

The `brk`() and `sbrk`() functions are historical curiosities left over from earlier days before the advent of virtual memory management.

The `brk`() function sets the break or lowest address of a process's data segment (uninitialized data) to addr (immediately above bss). Data addressing is restricted between addr and the lowest stack pointer to the stack segment. Memory is allocated by `brk`() in page size pieces; if addr is not evenly divisible by the system page size, it is increased to the next page boundary.

The current value of the program break is reliably returned by “`sbrk(0)`” (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 the rlim_max value returned from a call to getrlimit(2), e.g., ‘`etext + rlp->rlim_max`’ (see end(3) for the definition of etext).

# RETURN VALUES

The `brk`() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

The `sbrk`() function returns a pointer to the base of the new storage if successful; otherwise -1 with errno set to indicate why the allocation failed.

# ERRORS

`sbrk`() will fail and no additional memory will be allocated if one of the following are true:

[`ENOMEM`]
  The limit, as set by setrlimit(2), was exceeded.
[`ENOMEM`]
  The maximum possible size of a data segment (compiled into the system) was exceeded.
[`ENOMEM`]
  Insufficient space existed in the swap area to support the expansion.

# SEE ALSO

execve(2), getrlimit(2), mmap(2), end(3), malloc(3)

# HISTORY

A predecessor `break`() appeared in Version 1 AT&T UNIX. The `sbrk`() function call first appeared in Version 4 AT&T UNIX and `brk`() in Version 6 AT&T UNIX.

# BUGS

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).

September 8, 2019 | Debian