gpt4 book ai didi

c - exec 系列函数的工作

转载 作者:行者123 更新时间:2023-11-30 19:22:26 24 4
gpt4 key购买 nike

我正在研究 exec 系列函数。它的手册页说,它用新的进程镜像替换当前的进程镜像。如果替换二进制文件,那么返回后,它如何获取调用exec的进程的先前参数?因为替换进程镜像意味着替换其所有内存部分。如果我错了或知识较少,请纠正我。

最佳答案

真正的工作是由 execve(2) 完成的系统调用。所有其他函数(如 execvp ...)正在调用 execve .

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

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

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

地址空间的改变实际上主要是惰性完成的(使用 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)system(3) (他们为 pipe 调用 popen ,然后为 fork execve 调用 /bin/sh-c ....)。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com