【问题标题】:How does sbrk() work?sbrk() 是如何工作的?
【发布时间】:2017-06-14 06:58:48
【问题描述】:

我正在尝试了解 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));
}

这个输出:

end of break : 0xaa6000    
end of break : 0xac7000    
new end of the break : 0xac700a    

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

【问题讨论】:

  • @Meninx-メネンックス 我在你的链接中没有看到这个问题的答案。
  • 为什么投反对票?这个问题说得很清楚,而且完全合理。也仅通过查看文档或维基百科来回答。

标签: c unix sbrk brk


【解决方案1】:

sbrk(n) 将中断增加n 并返回中断的值。

因此:

    printf("end of the break : %p\n", sbrk(0));

输出:end of the break : 0xaa6000

最初,中断是 0xaa6000,sbrk 调用不会改变它。

    printf("end of the break : %p\n", sbrk(10));

输出:end of the break : 0xac7000

这是您要询问的值。上面我说sbrk(0)不会改变break,那为什么我们这里得到不同的值呢?

在两个sbrk 调用之间发生的唯一事情是对第一个printf 的调用。大概你的 stdio 实现的内部使用 malloc (例如创建缓冲区),这反过来又调用 sbrk 本身。换句话说,printf 在内部调用malloc,它使用sbrk 保留内存。

    printf("new end of the break : %p\n\n", sbrk(0));

输出:new end of the break : 0xac700a

这次我们看到增量为 0xa,这与您之前的 sbrk(10) 调用完全匹配。显然这一次printf 不需要分配动态内存(或者如果它这样做了,malloc 能够在它从第一个sbrk 获得的空间内做所有事情,所以它不必向操作系统)。

【讨论】:

  • 好的,谢谢,这只是因为 printf。谢谢你的回答!
猜你喜欢
  • 2011-01-05
  • 2010-11-03
  • 2011-01-04
  • 2013-04-08
  • 1970-01-01
  • 2017-07-24
  • 2016-11-13
  • 2017-10-11
  • 2021-10-13
相关资源
最近更新 更多