You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子进程调用exec()覆盖代码段后,父进程为什么仍能正常运行?

问题解答

核心原因是你混淆了父子进程的地址空间隔离特性:

  • fork()调用成功后,操作系统会为子进程创建完全独立的虚拟地址空间,和父进程的地址空间互相隔离,任意一方对自身内存的修改、替换都不会影响另一方。
  • 你提到的exec覆盖代码段、调用成功后永不返回的特性,仅对调用exec的子进程生效:
    • 子进程调用execvp后,只会替换自己的地址空间内容为wc程序的代码和数据,所以子进程中exec之后的printf("this shouldn't print out")永远不会执行,这也和你看到的运行结果一致,输出中没有这行内容。
    • 父进程的地址空间从头到尾都没有被修改,完整保留了p3.c的全部代码。
  • 父进程的执行逻辑完全独立:fork之后进入else分支,调用wait(NULL)进入阻塞状态,直到子进程(运行完wc程序后)退出,wait调用才会返回,之后父进程自然会继续执行后续的printf打印语句,所以你会看到父进程的输出。

内容的提问来源于stack exchange,提问作者Mattmmmmm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:18:03