c - execv 的参数会发生什么变化?

标签 c execv

我总是对这一点 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/

相关文章:

c - C 中的图像处理——处理一个 256 色位图图像

c - 使用 execv 在 C 中编写自己的 shell

c++ - 如何读取子进程的返回码

c++ - 为什么 OSX 事件监视器不显示我启动的进程?

c - 使用管道进行 fork 过程时程序崩溃

c++ - 是否可以忽略/丢弃 MPI_Allgather 中接收到的数据?

c - 尝试用C语言构建一个SSH蜜 jar

c - 交换未知变量类型的每两位

linux - 执行后,管道缓冲区中的内容消失

使用execl从txt中收集数据