首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谁在调用brk(NULL)?为什么?

谁在调用brk(NULL)?为什么?
EN

Stack Overflow用户
提问于 2019-09-13 14:28:21
回答 2查看 1.8K关注 0票数 4

我编写了一个很小的hello world程序,并在它的二进制文件上运行strace,它列出了在执行我的Hello_world程序时调用的所有系统调用。

代码语言:javascript
复制
strace ./a.out
execve("./a.out", ["./a.out"], [/* 40 vars */]) = 0
brk(NULL)                               = 0xb7d000

brk(NULL)用于查找当前DSS的上限,但我的问题是,谁想知道这一点,为什么?

edit1:我的程序中没有malloc

EN

回答 2

Stack Overflow用户

发布于 2019-09-13 18:03:25

无论您是否使用malloc(),很可能都是由C运行时库准备堆的。为此,它查询决策支持系统的当前大小并适当地设置控制结构,以便能够在调用第一个malloc()时立即采取行动。

票数 3
EN

Stack Overflow用户

发布于 2019-09-13 17:58:17

我写这篇文章作为答案,因为我没有足够的名气来评论。也就是说,我建议你看看this,尤其是this answer。

简而言之,当您执行一个程序时,一个正在运行的进程(在您的例子中是shell)需要调用fork()来通过复制自身来创建一个新进程。这个复制的进程是一个“子”进程,然后调用execve() (这是您看到的strace列出的第一个syscall ),这将有效地覆盖调用(“父”)进程的文本、数据、bss和堆栈。重要的是,在调用fork()之前可能已经动态分配给父进程的内存不会被保留。因此,brk(NULL)返回的地址对于两者来说是不同的。您的程序如何以及为什么使用这些信息超出了我的理解。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57918344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档