DragonFly On-Line Manual Pages
SBRK(2) DragonFly System Calls Manual SBRK(2)
sbrk -- change data segment size (obsolete)
Standard C Library (libc, -lc)
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 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.
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
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).
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.
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),
[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.
execve(2), getrlimit(2), mmap(2), end(3), free(3), malloc(3)
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).
DragonFly 5.5 March 1, 2019 DragonFly 5.5