如何使用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
相关产品推荐
相关产品推荐

