为什么hello world只打印两次,为什么a的最大值2

时间:2020-02-16 02:00:20

标签: c fork

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

int main() {
    int a=0;
    int rc=fork();
    a++;
    if(rc=0)
    {
        rc=fork();

        a++;
    }
    else
    {
       a++;
    }
    printf("Hello World");
    printf("%d",a);

    return 0;
}

2 个答案:

答案 0 :(得分:1)

      int a=0; //a=0
      int rc=fork();
        a++;//a=1
      printf("A before the if else");
      printf("%d",a);// a=1

      if(rc==0)// this was rc=0 it should have been rc==0
        {
            rc=fork();
            a++;//a=2
            printf("A inside the if");
            printf("%d",a);// a=2

        }
        else
        {        
            a++;//a=2
            printf("A inside the else");
            printf("%d",a);// a=2

        }
        printf("Hello World");// "Hello World"
        printf("%d",a);// a=2

        return 0;// always returns 0

为什么它两次打印Hello world的原因我不能从给出的代码中说出来,但是您必须两次调用main。如果您的语言有能力,我会使用堆栈trace()(不是c开发人员)

答案 1 :(得分:1)

hello world为什么只打印两次,为什么a的最大值是2

要回答您的问题(在更正(rc = 0)(rc == 0)问题之后),它可能有助于图解代码中正在发生的事情。例如:

    parent
      |
      a = 1
      if (rc == 0)
      +--------------- child 1
      |                   |
      else                +--------------- child 2
        a++               a++              a++
      a = 2               a = 2            a = 2
      Hello World2        Hello World2     Hello World2

在父进程中,您fork然后在测试a之前将a++if (rc == 0)递增a++,以指导子进程。由于else,原始父级再次看到"Hello World2",而结果是a++;

在第一个孩子中,您再次进行分叉,但是孩子1(作为父母)和孩子2都递增"Hello World2",然后退出带有#include <stdio.h> #include <unistd.h> int main (void) { int a = 1, rc = fork(); if (rc == 0) { a++; rc = fork(); if (rc == 0) a++; } printf ("Hello World %d\n", a); } 的条件结果。

似乎您正在尝试类似的操作:

$ ./bin/forkcount
Hello World 1
Hello World 2
Hello World 3

使用/输出示例

class a
{
    public:
        a(int c) : b([=]() -> int {
            if (c < MIN_ALLOWED || c > MAX_ALLOWED)
                throw std::logic_error("b");
            return c;
        }()) {}
    private:
        int b;

有时候铅笔和纸和键盘一样有用。如果您还有其他问题,请告诉我。