语法

#包括

int brk(void * addr);

无效* sbrk(intptr_t增量);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

brk(),sbrk():

Since glibc 2.19:
_DEFAULT_SOURCE ||
    (_XOPEN_SOURCE >= 500) &&
    ! (_POSIX_C_SOURCE >= 200112L)
From glibc 2.12 to 2.19:
_BSD_SOURCE || _SVID_SOURCE ||
    (_XOPEN_SOURCE >= 500) &&
    ! (_POSIX_C_SOURCE >= 200112L)
Before glibc 2.12:
_BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE>= 500

备注

避免使用brk()和sbrk():malloc(3)内存分配包是可移植且舒适的内存分配方式。

各种系统对sbrk()的参数使用各种类型。常见的是intssize_tptrdiff_t,intptr_t。

C library/kernel differences

上面为brk()描述的返回值是glibc包装函数为Linux brk()系统调用提供的行为。 (在大多数其他实现中,brk()的返回值是相同的;该返回值也在SUSv2中指定。)但是,实际的Linux系统调用成功返回新程序中断。失败时,系统调用将返回当前中断。 glibc包装函数完成了一些工作(即检查新的中断是否小于addr)以提供上述的0和-1返回值。

在Linux上,sbrk()被实现为使用brk()系统调用的库函数,并进行了一些内部记账,以便它可以返回旧的break值。

名称

brk,sbrk-更改数据段大小

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

返回值

成功时,brk()返回零。错误时,返回-1,并将errno设置为ENOMEM。

成功时,sbrk()返回上一个程序中断。 (如果增加了中断,则此值是指向新分配的内存的起点的指针)。出错时,返回(void *)-1,并且errno设置为ENOMEM。

说明

brk()和sbrk()更改程序中断的位置,该位置定义了进程数据段的结尾(即,程序中断是未初始化数据段结束之后的第一个位置)。增加程序中断的作用是为进程分配内存。减少中断会释放内存。

brk()将数据段的末尾设置为addr指定的值,当该值合理时,系统具有足够的内存,并且进程未超过其最大数据大小(请参阅setrlimit(2))。

sbrk()通过增加字节来增加程序的数据空间。以0增量调用sbrk()可用于查找程序中断的当前位置。

遵循规范

4.3BSD; SUSv1(在SUSv2中标记为LEGACY)已在POSIX.1-2001中删除。

BRK - Linux手册页

Linux程序员手册 第2部分
更新日期: 2016-03-15

另外参见

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

日期:2019-08-20 17:58:35 来源:oir作者:oir