为什么 if(fork() || fork() || fork()) 的行为不同?

问题描述 投票:0回答:1

为什么第二段代码没有像第一段代码那样创建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
c if-statement fork
1个回答
0
投票

在父进程中

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()
都会无条件执行,因此创建了七个子级。

© www.soinside.com 2019 - 2024. All rights reserved.