C语言中fork子进程能否成为父进程?程序输出异常原因咨询
问题解答
1. 子进程p1创建p2时,p1是否是p2的父进程?
是的。调用fork()的进程会成为新创建子进程的父进程,不管调用fork()的是初始父进程还是已经被fork出来的子进程。所以当p1调用fork()生成p2时,p1就是p2的父进程,p2的PPID(父进程ID)会等于p1的PID。
2. 程序是否应仅输出"Output"?
从代码逻辑上看,只有连续三次fork()都返回0的最内层子进程会执行printf("Output"),理论上程序应该只输出"Output"。但实际运行中会出现无输出的情况,原因见下文分析。
3. 运行时输出不一致的原因
问题出在进程退出时序和标准输出缓冲机制的交互上,具体细节如下:
- 代码中只有初始父进程(第一次
fork()的父进程)调用了wait(NULL),它仅等待第一层子进程p1退出,对p1的子进程p2、p2的子进程p3完全没有等待逻辑。 - p1创建p2后直接退出,p2创建p3后也直接退出,p3会成为孤儿进程被系统的init/systemd进程接管。
printf("Output")没有输出换行符\n,而标准输出stdout默认是行缓冲模式:只有当输出遇到换行、缓冲区被填满,或者主动调用fflush(stdout)时,才会把缓冲内容输出到终端。- 进程调度的时序是不确定的:
- 如果p3在初始父进程p0退出前完成了缓冲刷新,就能看到输出;
- 如果p0先等待p1退出后就结束进程,此时终端会话可能被重置,p3的输出缓冲还没来得及刷新就被丢弃,导致无输出。
如果在printf("Output")后添加fflush(stdout),或者改成printf("Output\n"),就能保证每次运行都能看到输出。
内容的提问来源于stack exchange,提问作者Marwane
相关产品推荐
相关产品推荐

