头文件unistd.h
sbrk/brk函数重新指定数据段的结束位置,sbrk(0)获得当前数据段结束地址
sbrk(增量),增量可正,可负,可为0,都返回原来数据段的结束地址。失败返回-1
brk(地址),返回0或-1.
通过重新指定数据段新的结束位置,操作系统会以页为单位映射到物理内存或解除物理内存的映射。
具体用法看下面例子
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("page info size is %d\n", getpagesize());//获取页的大小
int *p = sbrk(0); //获取当前数据段地址
printf("end address is %p\n", p);
brk(p+8); //数据段结束位置后移8*4个字节,实际映射了一页,即4096字节
int i =0;
for(; i < 18; i++) //数据越界不会出现段错误,因为是以页为单位4096个字节映射的
{
printf("%d ", p[i]);
}
printf("\n");
sbrk(4070); //数据段结束位置再后移4070个字节,(p = 32+ 4070 = 5002)此时内存映射了两页
p[1024] = 100;
printf("%d \n ", p[1024]);
sbrk(-6);//数据段结束位置前移6个字节,即p向后移了4096字节,此时解除映射第二页
printf("%d ", p[1024]); //此时出现段错误,因为 p[1024]超出第一页了。
}