Unix编程fork()调用后子进程为何会执行printf语句?
问题核心误区说明
你之前学到的「子进程仅会执行fork()调用之后的代码」这个结论完全正确,出现认知偏差的核心原因是你搞错了C语言函数参数的求值顺序。
C语言标准规定,函数调用的所有参数会在进入函数体之前完成求值,你写的printf("%d ", fork());语句的实际执行流程是:
- 先执行参数列表中的
fork()系统调用 fork()执行完成后,操作系统会创建出完全独立的父子两个进程:父进程中fork()返回子进程的PID(你示例中的9298),子进程中fork()返回0- 此时两个进程都会继续完成后续的逻辑,也就是把各自拿到的
fork()返回值作为参数传入printf()执行打印操作
等价代码对比
你写的代码和下面这种写法的执行逻辑完全一致,拆分之后就能很直观理解输出结果的来源:
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main() { pid_t fork_ret = fork(); printf("%d ", fork_ret); return 0; }
两个进程各自执行fork()之后的printf语句,自然就会输出两个数值,和你实际运行得到的结果一致。
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

