父进程退出后子进程仍会运行?科研程序进程问题咨询
父进程退出后子进程是否会继续运行?
答案是肯定的——你的子进程(也就是通过execvp()启动的linpack基准测试进程)会继续运行,哪怕父进程提前退出。
这里的核心原因和Linux进程模型的设计有关:
- 当你调用
fork()创建子进程时,系统会为子进程分配独立的PID、内存空间和资源,它和父进程是完全分离的执行流,只是初始状态继承了父进程的部分上下文。 - 如果父进程先于子进程退出,子进程会被系统的初始化进程(比如
init或者systemd,取决于你的操作系统)接管,成为所谓的“孤儿进程”。但这种接管只是负责在子进程结束后回收它的资源(避免僵尸进程),并不会中断子进程的正常执行。 - 结合你的代码场景来看,子进程通过
execvp()替换了自己的整个执行映像为linpack二进制,这时候它已经和原来的父进程代码彻底脱离,就算父进程因为任何原因退出,linpack进程都会继续完成它的基准测试任务,直到正常结束或者被外部信号终止。
另外补充一点:你的需求里提到父进程会“等待子进程退出”,正常情况下父进程会通过wait()或waitpid()这类系统调用阻塞直到子进程结束,这种场景下父进程会在子进程之后退出。但如果父进程因为异常(比如崩溃、被信号杀死)提前退出,子进程依然不受影响,会继续运行。
内容的提问来源于stack exchange,提问作者Amarjeet Sharma
相关产品推荐
相关产品推荐

