涉及fork()的C程序输出的说明

sus*_*hil 4 c fork

运行这个程序正在打印"分叉!" 7次.有人可以解释一下"分叉!" 正在打印7次?

#include<stdio.h>
#include<unistd.h>

int main(){

  fork() && fork() || fork() && fork();

  printf("forked!\n");

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

unk*_*ulu 5

这里使用了几个概念,第一个是知道fork在某些情况下它的作用和回报.很快,当它被调用时,它会创建一个重复的调用者进程,并在子进程中返回0(false对于逻辑表达式),true对于父进程则返回非零(对于逻辑表达式).实际上,它可以在出现错误时返回负(非零)值,但在这里我们假设它总是成功.

第二个概念为逻辑表达式,如短路计算&&||,特别地,0 && fork()调用fork(),因为如果第一个操作数是false(零),则没有必要以计算第二个.同样,1 || fork()也不会打电话fork().

另请注意,在子进程中,表达式的计算将继续与父进程中的计算相同.

另请注意,由于优先级,表达式按以下顺序计算:

(fork() && fork()) || (fork() && fork())
Run Code Online (Sandbox Code Playgroud)

这些观察结果应该引导您找到正确的答案.

考虑简化的例子 fork() && fork()

   fork()        
  /     \
false   true && fork()
                /   \
             false  true
Run Code Online (Sandbox Code Playgroud)

所以这里我们创建了三个进程,其中两个false作为结果返回,一个返回true.然后||我们让所有进程都返回false尝试再次运行相同的语句,所以我们得到2 * 3 + 1 = 7了答案.