可以用brk()改变程序中断,它标志着进程的数据段的终止,即程序中断是未初始化的数据段完成后的第一个位置。增加程序分解允许内存给进程;减少分解允许内存给进程。当这个量是合理的,系统会有足够的内存,并且进程没有超过它的最大数据量,brk()将数据段的结束设置为addr提供的值。Brk()如果成功返回0。如果出现错误,则返回-1。系统函数brk()和sbrk()被用来调节分配给进程的数据段的内存量。通常,这些函数是由一个更大的内存管理库函数(如malloc)调用的。brk()将addr的值分配给堆段的结尾,而sbrk()则通过brk()和sbrk()来移动程序断点,它确定了进程堆段的结束。它把你带回到先前的程序中断点。通过调用sbrk(),只需增加0,就可以找到程序中断的当前位置。
语法
#include <unistd.h>
int brk(void *end_data_segment);
void *sbrk(intptr_t increment);
语法的解释
brk()系统调用导致程序在结束数据段位置中断。由于虚拟内存是以页为单位分配的,所以结束数据段被四舍五入到下一个页的边界。试图将程序中断值降低到其初始值以下肯定会导致意想不到的行为,比如当试图访问初始化或未初始化数据段中现在无法访问的部分的数据时,会出现分段故障。有几个因素决定了程序断点可以放置的确切上限。
为什么在C语言中使用brk()系统调用
brk()函数是用来修改分配给调用者进程的内存量的。这种修改是通过改变进程的中断值到addr并提供必要的空间数量来实现的。brk()函数用于修改分配给调用方进程的内存量。随着中断值的上升,分配的空间数量也在上升。新分配的空间有一个0的值分配给它。如果程序先减去然后再增加断点值,重新分配的空间的值就不会被清空。