【问题标题】:How does fork with && and || Operator work?用 && 和 || 怎么分叉运营商工作?
【发布时间】:2020-07-07 09:43:29
【问题描述】:

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

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


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

知道它是如何工作的吗?

【问题讨论】:

  • 任何一本像样的书都应该教你关于逻辑运算符的short-circuit evaluation。他们还应该告诉你零被认为是“假”,任何非零都是“真”。 fork 手册页会告诉您它返回零或非零值。现在使用这些知识。
  • 只要不要写这种奇怪的、人工的代码就不会出现问题。在同一个表达式中将fork 与一堆其他运算符混合的任何人都会感到困惑。如果你这样做是为了学习,那么唯一的教训就是“不要编写非常奇怪的代码”。
  • 另请注意,这个确切的练习和问题显然很常见,如果您花一些时间在您最喜欢的搜索引擎上,您应该能够找到很多信息。
  • 请不要忘记接受您认为最有帮助的一个(并投票赞成)答案。
  • 谢谢你们的帮助!!

标签: c unix process fork


【解决方案1】:

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

1. Fork 返回值 - 当您在代码中的任何位置调用 fork 时,您将创建一个新进程,并且新进程也运行与父进程相同的代码。从 fork 给出的返回值可以知道父进程和子进程之间的区别。对于子进程,fork返回值等于0,对于父进程,它是非零的。

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

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

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

因此“Test”总共打印了 5 次。

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

【讨论】:

    【解决方案2】:

    根据 fork 创建成功与否,输出应该有所不同。如果所有分叉都创建成功,那么输出中应该会出现 5 次 Test。

    1- 一个主线程的输出。(1)

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

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

    【讨论】:

      【解决方案3】:

      首先:很抱歉这个问题。我没有做足够的研究,并且我没有将每个叉子视为子项和父项。

      我学到的是:

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

      【讨论】:

        猜你喜欢
        • 2011-07-09
        • 2012-03-21
        • 1970-01-01
        • 1970-01-01
        • 2017-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多