我知道,当我在Linux中调用某个exec()
系统调用时,它会用一个新映像替换当前正在运行的进程。因此,当我派生一个新进程并运行exec()
时,该子进程将被新进程替换。
我从堆中分配的任何内存会发生什么情况?假设我想解析任意数量的命令并将其发送到exec()
。为了容纳这个任意的数字,我可能不得不在某个时刻分配内存,因为我不认为我可以使用静态大小的数组正确地分配内存,所以我可能会使用malloc()
或类似的东西。
我需要将分配的内存保留到调用exec()
之后,但exec()
再也没有返回。
内存是否会被操作系统回收?
发布于 2011-03-25 07:16:52
当您调用fork()
时,将创建调用进程的副本。这个子进程(几乎)与父进程完全相同,也就是说,由malloc()
分配的内存是保留的,您可以自由读取或修改它。修改对父进程是不可见的,因为父进程和子进程是完全分开的。
在子进程中调用exec()
时,子进程将被一个新进程替换。摘自execve(2):
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()
调用中保留,因此该内存也会被回收。
发布于 2011-03-25 09:33:31
整个堆--分配的内存,以及用来管理它的所有逻辑malloc --都是被替换的进程映像的一部分。就您的进程而言,它只是消失了。当然,系统会回收它并回收它。
https://stackoverflow.com/questions/5429141
复制相似问题