(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 programming或popen(3)(它们分别为pipe
调用popen
,然后是fork
execve
的/bin/sh
&-c
....)。
关于c - exec系列功能的工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16483956/