This question already has answers here:
Please explain the exec() function and its family
                                
                                    (7个答案)
                                
                        
                                在10个月前关闭。
            
                    
我正在研究exec函数家族。其手册页说,它将新的过程映像替换为当前过程映像。如果替换了二进制文件,则返回后如何获得称为exec的进程的先前参数?由于替换进程映像意味着替换了其所有内存部分。如果我输入错误或知识不足,请更正我。

最佳答案

真正的工作是通过execve(2)系统调用完成的。所有其他功能(如execvp ...)都在调用execve

execve是一个非常复杂的系统调用。成功时不会返回。但是进程状态(包括地址空间)已被[几乎]完全重写。

因此,基本上,地址空间正在变得新鲜。它包含来自二进制可执行文件的段。

程序参数,环境等已被复制(在堆栈段的底部)到新的地址空间中。因此它们受到限制(受ARG_MAX限制,通常为128KB-但您可以通过重新编译内核来提高它)。

实际上,地址空间的更改大部分是延迟完成的(使用copy on write);实际上,分页是无效的,随后的访问会得到页面错误,内核通过提供新页面等来服务,等等。

在Linux上,我建议研究/proc/(有关更多信息,请参见proc(5))。特别是,尝试cat /proc/self/maps,它将为您显示运行该cat的进程的地址空间映射。

当然,execve通常在fork(2)之后使用,并且可能还与dup2(2)和/或pipe(2)一起使用,以及一些等待的系统调用(例如waitpid(2)wait4(2)),也许可以处理SIGCHLD信号-请参见&signal(7)。请阅读例如sigaction(2)(您可以在线阅读)。

您也可以考虑使用advanced linux programmingpopen(3)(它们分别为pipe调用popen,然后是fork execve/bin/sh-c ....)。

关于c - exec系列功能的工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16483956/

10-13 03:32