1、输出多少个“-”
int main(){
for (int i = 0; i < 4;i++){
fork();
cout << "-" << endl;
}
return 0;
}
30个
每fork()一次进程数量翻倍,各自打印一次“-”
当i=0,fork()后进程总数为2,打印2个“-”
当i=1,fork()后进程总数为4,打印4个“-”
当i=2,fork()后进程总数为8,打印8个“-”
当i=3,fork()后进程总数为16,打印16个“-”
2+4+8+16=30
2、创建进程的个数(fork()创建进程的次数,且不算main的进程个数)
int main(){
fork();
fork() && fork() || fork();
fork();
}
19个
对fork()从1到5进行编号
第一个fork()后进程总数为2,编号为A,称谓2A,之后每一轮fork()出来的进程编号依次为BCD
此时遇到 fork() && fork(),2A第二个fork()后进程总数为4,分别是2A+2B
由于fork()的特性,在父进程中返回子进程的pid,在子进程中返回值为0,所以在2A中返回值大于0,即(1 && ?),会继续找下一个条件进行判断,在2B中返回值小于0,即(0 && ? == 0)表达式不成立,不需要找下一个条件。即2A会经历第三个fork(),但2B不会。于是2A第三个fork()后进程总数为6,分别是2A+2B+2C
再接下来遇到 (结果) || fork(),对2B,它的结果为(0 && ?) == 0, 那么(0 || ?)需要判断下一个条件,即会走第四个fork(),生成2个D;对2C,它的结果为(1 && 0) == 0,也是(0 || ?)需要判断下一个条件,也会走第四个fork(),生成2个D;合计生成4个D,此时进程总数为10,分别是2A+2B+2C+4D
第五个fork()进程数量翻倍,变为20个,除去main剩下19个