fork循环调用输出顺序反转,添加wait未生效问题求助
问题原因
你修改后的代码没有达到预期效果,核心问题是printf语句的执行时机不对:
- 原代码中
printf位于子进程的执行路径中,且在子进程创建下一级子进程之前执行,子进程会先打印自己对应的字符,再生成下一级子进程,就算父进程加了wait等待子进程,输出顺序依然是A→B→C→D。 - 要实现反向输出,需要让每个进程先等待自己的子进程完全执行完毕,再打印自身对应的字符,这样最内层的子进程没有子进程需要等待,会最先输出对应D的内容,再逐层向上返回,父进程依次输出C、B、A。
修正后可实现D→C→B→A输出的代码
#include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> int main(){ int i; for(i=0;i<4;i++){ if (fork()){ wait(NULL); printf("Mon nom est %c. Je viens du processus %d\n",'A'+i,getpid()); break; } } return 0; }
执行逻辑说明
- 第1轮循环i=0:最外层父进程fork出子进程1,父进程进入wait阻塞状态,等待子进程1执行结束。
- 子进程1进入第2轮循环i=1:fork出子进程2,子进程1进入wait阻塞状态,等待子进程2执行结束。
- 子进程2进入第3轮循环i=2:fork出子进程3,子进程2进入wait阻塞状态,等待子进程3执行结束。
- 子进程3进入第4轮循环i=3:fork出子进程4,子进程3进入wait阻塞状态,等待子进程4执行结束。
- 子进程4进入下一轮循环时i=4,不满足i<4的循环条件,直接退出进程。
- 子进程3wait到子进程4退出后,打印字符
A+3=D,然后break退出循环,进程结束。 - 子进程2wait到子进程3退出后,打印字符
A+2=C,然后break退出循环,进程结束。 - 子进程1wait到子进程2退出后,打印字符
A+1=B,然后break退出循环,进程结束。 - 最外层父进程wait到子进程1退出后,打印字符
A+0=A,然后break退出循环,进程结束。
最终输出顺序就是你需要的D、C、B、A。
内容的提问来源于stack exchange,提问作者Malek Hammou
相关产品推荐
相关产品推荐

