Почему hello world печатает только дважды и почему это самое большое значение 2 - PullRequest
0 голосов
/ 16 февраля 2020
#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 ]

1 голос
/ 16 февраля 2020

Почему hello world печатает только дважды и почему наибольшее значение 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" является результатом.

В первом дочернем элементе вы снова выполняете форк, но дочерний-1 (как родительский) и дочерний-дочерний 2 оба увеличивают a++; перед выпадением из условия с "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

Иногда карандаш и бумага так же полезны, как клавиатура. Дайте мне знать, если у вас есть дополнительные вопросы.

1 голос
/ 16 февраля 2020
      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. если бы у вашего языка была возможность, я бы использовал трассировку стека () (не c разработчик)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...