为什么第二段代码没有像第一段代码那样创建7个进程? 任何地方都说 fork() 的子进程与父进程从同一点运行。这不是意味着 if 语句中的第二个 fork() 也应该在子进程内部运行吗?
这段代码输出:
int a = fork(), b=fork(), c = fork();
if(!a || !b || !c){
printf("msg: pid = %d\n", getpid());
}
return 0;
输出:
msg: pid = 28740
msg: pid = 28737
msg: pid = 28738
msg: pid = 28742
msg: pid = 28739
msg: pid = 28741
msg: pid = 28743
而以下代码:
if(!fork() || !fork() || !fork()){
printf("msg: pid = %d\n", getpid());
}
return 0;
输出:
msg: pid = 29385
msg: pid = 29386
msg: pid = 29387
在父进程中
fork()
始终评估子进程的 PID。在子进程中,它的计算结果始终为零。由于 PID 不能为 0,因此 fork()
的返回值在父进程中始终为 true-y,而在子进程中始终为 false-y。
当您将
fork()
与逻辑 not (!
) 和逻辑或运算符 (||
) 结合使用时,最终效果是在父级中 !fork() || ...
语句始终执行所有三个 forks(),并且 执行不进入if
的身体。因为它相当于(0 || 0 || 0)
。然而,在子进程中,当子进程开始执行时,最后执行的 !fork()
计算结果为 true-y 值,因此逻辑或运算符短路并停止执行条件语句的其余部分,而是进入if
语句的主体。在子项中,条件语句的评估如下:
if (true || <last two forks not executed>)
if (false || true || <last fork not executed>)
if (false || false || true) <nothing left to execute in conditional>
if (false || false || false) <if body not executed>
在您给出的前一个示例中,所有
forks()
都会无条件执行,因此创建了七个子级。