Q: 程序执行后, 下面的代码一共创建了多少个进程?
#include <unistd.h>
#include <stdio.h>
int main()
{
fork();
fork() && fork() || fork();
fork();
return 0;
}
在写这道题目之前, 很重要的一点是 A && B || C 在不同的条件下会怎么执行. 根据 C 语言的运算符优先级, && 的优先级比 || 的优先级要高, 所以该表达式也可以看成是 (A && B) || C, 同时由于逻辑表达式的短路, 如果 A 为假, 那么 B 的值就不会被计算, 结果均为假, 同理如果 A || B 的值为真, 那么 C 的值也不会被计算, 结果均为真, 否则后面的表达式都需要被计算来确定最终的值.
本题中的 fork() 函数会创建一个新的进程, 在父进程和子进程中都会返回,并且它的返回值在子进程和父进程中是不同的. 父进程中返回子进程的进程号, 子进程中返回 0, 如果出错就返回一个负数.
根据上述分析, 我们容易得到以下结果:
计算所有的 fork 数量, 我们可以得到创建了 19 个进程, 或者看最后生成的进程数量 20 减去最开始的第一个进程, 也能得到程序创建了 19 个进程.