首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在exec()更改程序映像之后,malloc‘’ed内存发生了什么变化?

在exec()更改程序映像之后,malloc‘’ed内存发生了什么变化?
EN

Stack Overflow用户
提问于 2011-03-25 14:08:13
回答 2查看 10.7K关注 0票数 38

我知道,当我在Linux中调用某个exec()系统调用时,它会用一个新映像替换当前正在运行的进程。因此,当我派生一个新进程并运行exec()时,该子进程将被新进程替换。

我从堆中分配的任何内存会发生什么情况?假设我想解析任意数量的命令并将其发送到exec()。为了容纳这个任意的数字,我可能不得不在某个时刻分配内存,因为我不认为我可以使用静态大小的数组正确地分配内存,所以我可能会使用malloc()或类似的东西。

我需要将分配的内存保留到调用exec()之后,但exec()再也没有返回。

内存是否会被操作系统回收?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-25 15:16:52

当您调用fork()时,将创建调用进程的副本。这个子进程(几乎)与父进程完全相同,也就是说,由malloc()分配的内存是保留的,您可以自由读取或修改它。修改对父进程是不可见的,因为父进程和子进程是完全分开的。

在子进程中调用exec()时,子进程将被一个新进程替换。摘自execve(2):

代码语言:javascript
运行
复制
execve() does not return on success, and the text, data, bss, and stack
of the calling process are overwritten by that of the program loaded.

通过覆盖data段,exec()调用有效地回收了以前由malloc()分配的内存。

父进程不受所有这一切的影响。假设您在调用fork()之前已经在父进程中分配了内存,那么该内存在父进程中仍然可用。

编辑:malloc()的现代实现使用匿名内存映射,请参阅mmap(2)。根据execve(2),内存映射不会在exec()调用中保留,因此该内存也会被回收。

票数 35
EN

Stack Overflow用户

发布于 2011-03-25 17:33:31

整个堆--分配的内存,以及用来管理它的所有逻辑malloc --都是被替换的进程映像的一部分。就您的进程而言,它只是消失了。当然,系统会回收它并回收它。

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

https://stackoverflow.com/questions/5429141

复制
相关文章

相似问题

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