Linux编程疑问:fork创建的子进程是否会先于父进程执行打印输出
核心结论
完全存在子进程先于父进程完成打印输出的场景,你观测到的父进程优先输出只是当前测试环境下的调度表现,绝非Linux系统的固定执行规则。
你当前环境固定父进程先输出的原因
- 主流Linux内核使用的CFS完全公平调度器,在fork创建新进程的默认逻辑中,不会直接剥夺父进程持有的CPU时间片:父进程会继续在当前CPU上执行,直到时间片耗尽或者被更高优先级任务抢占;子进程会被放入CPU就绪队列尾部等待调度。这种低负载场景下自然会出现父进程先完成printf输出的结果。
- 你提供的代码中,首条
printf语句带换行符,终端环境下会触发标准输出的行缓冲机制,直接将内容刷新到内核的输出缓冲区,fork创建子进程时,两个进程的用户态stdout缓冲区没有残留未刷新的内容,不会出现缓冲内容重复打印的异常问题。
可触发子进程先打印的常见场景
- 父进程主动让出CPU:fork完成后如果父进程主动调用
sched_yield()接口让出当前CPU执行权,内核调度器会直接从就绪队列中选择刚创建的子进程执行,此时子进程必然先完成打印输出。 - 人为设置优先级差异:如果通过代码将子进程的调度优先级设置为高于父进程(比如切换为SCHED_FIFO实时调度类),fork完成后父进程会立刻被高优先级的子进程抢占,子进程会先跑完打印逻辑。
- 系统高负载场景:当Linux机器整体CPU负载很高时,fork完成的瞬间父进程可能因为中断处理、其他高优先级任务抢占被剥夺CPU,内核选择下一个执行任务时很可能优先调度到刚创建的子进程。这类场景下多次运行同一段代码,输出顺序完全随机,既可能父进程先打印,也可能子进程先打印。
- 最快复现方式:在原代码的父进程分支开头加一行
usleep(100 * 1000);让父进程休眠100毫秒,重新编译运行即可100%观测到子进程的打印内容先输出。
关键认知提醒
POSIX标准从未规定fork之后父子进程的执行先后顺序,两种执行顺序都是内核的合法行为,不存在“必须谁先运行”的强制约束。你之前碰到的固定父进程先输出的现象,只是低负载、默认调度参数下的常见表现,不代表系统的固定行为。
内容的提问来源于stack exchange,提问作者Khoa Hữu Bảo Huỳnh
相关产品推荐
相关产品推荐

