NAME
sbrk
—
change data segment size
(obsolete)
LIBRARY
library “libc”
SYNOPSIS
#include
<sys/types.h>
#include <unistd.h>
void *
sbrk
(intptr_t
incr);
DESCRIPTION
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).