繁体   English   中英

用 && 和 || 怎么分叉运营商工作?

[英]How does fork with && and || Operator work?

我想了解这个程序的 Output。 但我不明白。 我读到了 fork 以及它是如何工作的,我试图理解它,但是当我将它与 && 或 || 混合使用时运营商我不明白为什么 Output 是不同的。 有时我得到一个字,有时是 2、3、4...

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


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

知道它是如何工作的吗?

基于 fork 创建成功与否,output 应该有所不同。 如果所有分叉都创建成功,那么 output 中应该会出现 5 次测试。

1- 一个 output 用于主线程。(1)

2-主线程创建两个分叉( firstpart -> (fork() && fork() || secondpart->fork() )因为第一部分评估为真,第二部分不在主线程中执行。所以两个 output 应该在这里看到。(1+2)

3-每两个创建的分叉创建一个新分叉,但第一部分不在子级中执行,但第二部分在每个子级中执行,因此在总共 5 个输出中会看到另外两个输出。(1+2+2)

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

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

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

  • 对于语句 && where and are 2 需要计算为真或假的表达式,只有当第一个表达式 () 被计算为真时,才检查第二个表达式 () 的正确性。 这是因为,如果本身为假,那么无论 的值如何,结果逻辑表达式都会变为假,从而使评估无用。
  • 对于像 || 这样的语句,仅当为 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

第一:对不起这个问题。 我没有做足够的研究,并且我没有将每个叉子视为子项和父项。

我学到的是:

  1. 第一个 fork 将运行并创建一个子进程。现在我们有 2 个进程,Parent 返回一个不等于 0 的数字,Child 返回 0。
  2. 因为Parent返回的数字不是0,所以&&之后的fork也会运行,并且会创建另一个子进程。 1 个子进程返回 0,因此它不会在 && 之后运行。 我们现在有 3 个进程
  3. || 之后的分叉不会为父级运行,因为它返回的数字不是 0,但它会为子级运行,因为它返回 0,所以我们最终得到 5 个进程。 希望我是对的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM