【问题标题】:What happens to dynamic allocated memory when calling execv()?调用 execv() 时动态分配的内存会发生什么?
【发布时间】:2011-04-11 05:40:16
【问题描述】:

我正在编写一个简单的 shell 作为 OS 课程作业,我需要在 PATH 中搜索以找到用户键入的程序,一旦找到正确的目录,我会分配一块内存,刚好足以容纳该目录名称加上程序名称,我将其作为第一个参数传递给 execv()。

我本可以静态分配 100 个左右的字符,但是有一个限制让我感到不舒服。那么当 execv() 执行时,是清理了堆还是丢失了那块内存?

这可能不是很多内存,但我只是好奇。

【问题讨论】:

  • 如果你静态分配了一个缓冲区来保存你的路径,它必须至少是 Linux 绝对路径的最大长度。谷歌搜索显示这是4096(来自/usr/src/linux-2.4.20-8/include/linux/limits.h#define PATH_MAX 4096 /* # chars in a path name including nul */)。所以你应该包括limits.h 并使你的缓冲区长度为PATH_MAX 个字符。

标签: c linux operating-system


【解决方案1】:

当您exec() 时,整个过程(a)结束,因此包括动态内存和如下一些 fd 在内的所有资源都被操作系统回收,并且(b)替换:代码、数据、线程、. ..

重新文件描述符,来自"man execve"

在调用进程映像中打开的文件描述符在新进程中保持打开状态 进程映像,设置了 close-on-exec 标志的进程映像除外 (参见 close(2) 和 fcntl(2))。保持打开状态的描述符不受影响 通过 execve()。

【讨论】:

  • 也许这很明显,但这只适用于成功的高管。如果不成功,原始进程将继续使用仍然分配的动态分配的内存。
  • 换句话说,exec() 调用将其参数分配到内存中原始进程空间之外的某个位置,因此当它用 exec 的程序替换可执行映像时,这些参数位于main() 的新初始调用堆栈。
  • @DavidRTribble exec() 参数被复制到内核空间,因为它是一个系统调用。在这方面,exec() 没有什么特别之处。
猜你喜欢
  • 1970-01-01
  • 2019-06-17
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多