核心内容摘要
深入探讨C++中的函数指针与类型约束
问题描述代码如下不算main进程本身问总共创建了多少个子进程intmain(intargc,char*argv[]){fork();fork()fork()||fork();fork();}选项A.18 B.19 C.20 D.21先把结论放前面程序最终一共会有20 个进程包含最初的main进程因为题目要求“不算main进程本身”所以创建的子进程数为20 - 1 19正确选项B.19必备知识点fork 返回值 C 里的真假1fork()做了什么fork()会复制当前进程产生一个子进程在父进程中fork()返回子进程 pid0在子进程中fork()返回0失败返回 -1本题默认不考虑失败2C 语言中真假如何判断0表示假false非 0表示真true所以父进程里fork()的返回值为真子进程里fork()的返回值为假本题的灵魂/||的短路求值 优先级1优先级在 C 语言里的优先级高于||因此这句fork()fork()||fork();等价于(fork()fork())||fork();2短路规则务必牢记A B如果A为假则不再计算 BA || B如果A为真则不再计算 B运算从左到右求值逐行计算进程数怎么变我们按“每一行执行后进程数乘几”来算。
第 1 行fork();每个进程执行一次fork()都会一分为二1 个进程 → 2 个进程也就是×2第 2 行(fork() fork()) || fork()这一行最容易错。
关键点不同分支会不会继续执行后面的fork()取决于短路。
下面用“一个进程进入这一行”为例算这一行最终会变成多少个进程。
可视化流程图Mermaid父: pid为正 真子: 返回0 假父: pid为正 真子: 返回0 假进入表达式fork1进入 AND 右侧AND 短路进入 OR 右侧fork2左侧为真OR 短路左侧为假执行 fork3fork3fork3结束结束结束用“分支计数法”数进程设进入这一行前只有 1 个进程先执行第一个fork()记作 F1变成2 个进程父进程F1 返回真子进程F1 返回假对父进程F1 为真需要继续算右侧于是执行第二个fork()F2F2 又把该父分支变成2 个进程F2 父true true为真 →||短路 →不执行第三个 forkF2 子true false为假 → 进入||右侧 →会执行第三个 forkF3再分裂一次对子进程F1 为假短路第二个fork()不执行直接进入||右侧会执行第三个fork()F3再分裂一次把最终的进程数列一下从 1 个进程进入该行开始F1 父 F2 父1 个不会执行 F3F1 父 F2 子会执行 F3 → 2 个F1 子会执行 F3 → 2 个总计1 2 2 5所以这一行的效果是×5经验化记忆(fork() fork()) || fork()每个进入的进程最终会变成 5 个。
第 3 行fork();最后一行再次每个进程一分为二×2汇总最终进程数与创建进程数设最开始只有 1 个main进程语句乘法因子执行后总进程数初始-1fork();×22(fork() fork())fork();×510fork();×220最终总进程数包含main20创建的子进程数不算main20 - 1 19常见坑位