我总是对这一点 C 魔术有点模糊。当您调用 execv 时,您是在“替换过程镜像”。这到底是什么意思呢?只是数据段?一切都分配给进程?堆栈?堆?
我的问题是传递给 execv 的参数所使用的存储空间发生了什么变化?如果它们是调用 execv 的函数的局部变量,那么它们就在堆栈上。但是如果你替换进程镜像,并调用新进程的 main() 函数,当 main() 返回时会发生不好的事情,因为指向主调用返回位置的堆栈信息被新进程镜像替换。 变量也一样,是吗?如果这些变量是在堆上分配的呢?
好问的头脑是在向任何知道的人提问。
最佳答案
exec
一系列函数取代了整个过程——数据、堆栈、文本、堆,一切。某些文件描述符可以保持打开状态(那些由未设置 FD_CLOEXEC
的原始进程打开的文件描述符)。但除此之外,您几乎获得了一个全新的流程 - 请参阅链接了解所有详细信息。
你传入的参数发生了什么是操作系统的问题 - 它必须确保它们以符合标准的方式传递给新进程的 main
函数,但我不不要认为 POSIX 明确规定了它是如何做到这一点的。
对于 Linux,您可以查看 fs/exec.c
文件以查看实现。跳到接近尾声(我发布这篇文章时是第 1484 行)以查看 do_execveat_common
函数,它是实现的主要部分。您会看到参数被复制到新的地址空间(在函数末尾调用 copy_strings
)。
关于c - execv 的参数会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34117815/