sbrk()如何运作?

Myr*_*ova 1 c unix sbrk brk

我试图了解它是如何sbrk工作的.

这是我的小代码:

int  main()
{  
    printf("end of the break : %p\n", sbrk(0));
    printf("end of the break : %p\n", sbrk(10));
    printf("new end of the break : %p\n\n", sbrk(0));
}
Run Code Online (Sandbox Code Playgroud)

这输出:

end of break : 0xaa6000    
end of break : 0xac7000    
new end of the break : 0xac700a    
Run Code Online (Sandbox Code Playgroud)

为什么前2个地址0xac7000 - 0xaa6000 = 21000而不是10?

mel*_*ene 8

sbrk(n)递增中断n并返回中断的值.

从而:

    printf("end of the break : %p\n", sbrk(0));
Run Code Online (Sandbox Code Playgroud)

输出: end of the break : 0xaa6000

最初,中断为0xaa6000,并且sbrk调用不会更改它.

    printf("end of the break : %p\n", sbrk(10));
Run Code Online (Sandbox Code Playgroud)

输出: end of the break : 0xac7000

这是你要问的价值.上面我说sbrk(0)不会改变休息时间,为什么我们在这里获得不同的价值呢?

在两个sbrk呼叫之间发生的唯一事情是对第一个呼叫的呼叫printf.据推测,stdio实现的内部使用malloc(例如创建缓冲区),而后者又调用sbrk自身.换句话说,内部printf调用malloc,保留内存使用sbrk.

    printf("new end of the break : %p\n\n", sbrk(0));
Run Code Online (Sandbox Code Playgroud)

输出: new end of the break : 0xac700a

这次我们看到增量为0xa,与之前的sbrk(10)呼叫完全匹配.显然这次printf不需要分配动态内存(或者如果它确实malloc能够在第一个空间内完成所有内容sbrk,所以它不需要从操作系统请求更多内容).