PCB设计工程师核心技能与学习路径:从入门到进阶
2026/7/16 5:45:05
代码如下(不算main进程本身,问总共创建了多少个子进程):
intmain(intargc,char*argv[]){fork();fork()&&fork()||fork();fork();}选项:A.18 B.19 C.20 D.21
main进程)main进程本身”,所以创建的子进程数为:20 - 1 = 19fork()做了什么?fork()会复制当前进程,产生一个子进程:
fork()返回子进程 pid(>0)fork()返回00表示假(false)非 0表示真(true)所以:
fork()的返回值为真fork()的返回值为假&&/||的短路求值 + 优先级在 C 语言里:&&的优先级高于||
因此这句:
fork()&&fork()||fork();等价于:
(fork()&&fork())||fork();A && B:如果A为假,则不再计算 BA || B:如果A为真,则不再计算 B我们按“每一行执行后,进程数乘几”来算。
fork();每个进程执行一次fork(),都会一分为二:
(fork() && fork()) || fork()这一行最容易错。关键点:不同分支会不会继续执行后面的fork(),取决于短路。
下面用“一个进程进入这一行”为例,算这一行最终会变成多少个进程。
设进入这一行前只有 1 个进程:
先执行第一个fork()(记作 F1)
对父进程(F1 为真):
&&右侧,于是执行第二个fork()(F2)true && true为真 →||短路 →不执行第三个 forktrue && false为假 → 进入||右侧 →会执行第三个 fork(F3),再分裂一次对子进程(F1 为假):
&&短路:第二个fork()不执行||右侧:会执行第三个fork()(F3),再分裂一次把最终的进程数列一下(从 1 个进程进入该行开始):
总计:1 + 2 + 2 = 5
所以这一行的效果是:
经验化记忆:
(fork() && fork()) || fork()每个进入的进程最终会变成 5 个。
fork();最后一行再次每个进程一分为二:
设最开始只有 1 个main进程:
| 语句 | 乘法因子 | 执行后总进程数 | |
|---|---|---|---|
| 初始 | - | 1 | |
fork(); | ×2 | 2 | |
| (fork() && fork()) | fork(); | ×5 | 10 |
fork(); | ×2 | 20 |
main):20main):20 - 1 = 19&&优先级高于||,没加括号就按错误方式理解表达式fork()全执行main进程本身”:最终进程数要再减 1这类题的核心不是“fork 有多难”,而是:
fork()在父子进程中的返回值真假不同&& / ||的短路会让某些分支“跳过 fork”,从而改变进程增长倍率