首页 > 解决方案 > 用 && 和 || 怎么分叉 运营商工作?

问题描述

我正在尝试了解该程序的输出。但我不明白。我读到了 fork 以及它是如何工作的,我试图理解它,但是当我将它与 && 或 || 混合使用时 操作员我不明白为什么输出不同。有时我得到一个字,有时是 2、3、4...

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


int main (int argc, char *argv[]) {
    (fork()&&fork()) || fork();
   printf("Test\n");
    return 0;
}

知道它是如何工作的吗?

标签: cunixprocessfork

解决方案


有助于更好地理解此代码的内容:

1.fork返回值——当你在代码中的任何地方调用fork时,你就创建了一个新进程,新进程也运行与父进程相同的代码。从 fork 给出的返回值可以知道父进程和子进程的区别。对于子进程,fork返回值等于0,对于父进程,它是非零的。

2. 短路逻辑评估 -在 C 中执行布尔逻辑时,执行以短路方式运行。

  • 对于语句 && where and are 2 需要被评估为真或假的表达式,只有当第一个表达式 () 被评估为 true 时,才会检查第二个表达式 () 的正确性。这是因为,如果本身为假,那么无论 的值如何,生成的逻辑表达式都会变为假,因此使评估无用。
  • 对于像 || 这样的声明 , 仅在为 false 时执行,原因与上述类似。

在您的代码片段中,执行第一个 fork() 后,子进程跳过第二个 fork(由于 && 短路)并转到第三个 fork()。导致“Test”打印了 2 次。然后原始父进程遇到第二个 fork(),新的子进程继续执行第三个 fork() 并再次打印 Test 2 次。父级跳过第三个 fork(),至于它,第一个和第二个 fork 都是非零(|| 的短路)并打印一次“Test”。

因此,“测试”总共打印了 5 次。

       P1 (fork-1)
      /          \
     P2(fork-2)  P1 (fork-2)
    /  \        /         \
   P3  P2     P4(fork-3)  P1
              /  \
             P4   P5

推荐阅读