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

如何使用wait函数控制进程执行顺序,调整子进程与孙进程的输出顺序

代码问题修正

你当前的代码核心逻辑顺序错误,子进程先打印自身ID再创建、等待孙进程,自然孙进程的输出会在子进程之后。调整逻辑顺序即可实现需求,修正后代码如下:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void) {
    int pid;
    int pid2;
    pid = fork();

    switch(pid) {
        case -1:
            printf("Error: Not able to fork process");
            break;
        case 0:
            // 子进程优先创建孙进程
            pid2 = fork();
            if (pid2 == 0) {
                printf("Grandchild ID: %d\n", getpid());
            } else if (pid2 != -1) {
                // 等待孙进程执行完毕再打印子进程ID
                wait(NULL);
                printf("Child ID:      %d \n", getpid());
            }
            break;
        default:
            // 父进程等待子进程全部执行完毕再打印自身ID
            wait(NULL);
            printf("Dad ID:        %d \n", getpid());
            break;
    }
    return 0;
}

调整点说明:

  • 删除了fork之后全局的wait(NULL)调用,避免子进程创建后无意义等待
  • 调整子进程的执行顺序:先创建孙进程,等待孙进程执行完成(输出孙进程ID)后,再打印子进程自身的ID
  • 父进程的等待逻辑移到default分支开头,保证父进程最后输出
进程顺序控制学习资源推荐
  • 《UNIX环境高级编程》第8章:进程控制部分对fork、wait、waitpid等系统调用有非常详尽的讲解,附带大量可运行的多进程控制示例,完全覆盖作业需求的场景
  • 操作系统官方教材「进程管理」章节:不管是国内通用的汤小丹版《操作系统》,还是国外的《操作系统导论》,都有专门的进程同步、多进程顺序控制的原理讲解和配套习题
  • Linux系统自带man手册:在终端执行man 2 fork、man 2 wait即可查看系统调用的官方说明,参数、返回值、注意事项都有明确标注,是最权威的参考资料

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:42:00