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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:09:03