Почему мой fork () не разветвляет дочерний элемент и не выводит операторы print? - PullRequest
0 голосов
/ 27 марта 2019

Я пишу AC-программу в Ubuntu, и в коде я использую fork () для генерации 5 разных дочерних элементов.Но когда я компилирую и запускаю свою программу, дочерние элементы не создаются, а printf («Test»), который я помещаю в три оператора if (для case fork () == 0,> 0, <0), только в> 0, там в выводе операторов printf.

На самом деле некоторое время назад fork () работал просто отлично, но после того, как я продолжил свою работу над программой, он вдруг не работает.

Почему это происходит и как мне это исправить?это?

for (i = 0; i < proc; ++i){
    printf("In for %d",i);
    // TODO
    int fork_result = fork();
    if (fork_result == 0){ // Create child process
        child_pids[i] = getpid();
        printf("Test 5");
        printf("In if %d",i);
        break;
    }
    else if(fork_result < 0){
      printf("Fork failed");
    }
    else if (fork_result > 0){
      printf("Parent");
    }
}

Что ж, ожидаемый результат состоит в том, что он будет содержать «Тест 5» или «В случае»

Фактический результат:

In for 0In for 1In for 2In for 3In for 4

КакойФактический вывод не содержит "Тест 5"

1 Ответ

1 голос
/ 27 марта 2019

Дочерний процесс продолжает выполнять код вызывающей стороны.Вызывающий, скорее всего, не ожидает казни родителя и всех детей.Вы должны выйти из дочернего процесса до того, как это произойдет:

for (i = 0; i < proc; ++i){
    printf("In for %d",i);
    fflush(stdout); // <--- here
    // TODO
    int fork_result = fork();
    if (fork_result == 0){ // Create child process
        child_pids[i] = getpid();
        printf("Test 5");
        printf("In if %d",i);
        exit(0);  // <---- must have this
        break;
    }
    else if(fork_result < 0){
      printf("Fork failed");
    }
    else if (fork_result > 0){
      printf("Parent");
    }
}
// without the exit above the child will execute this code:
Some code

Вы должны очистить стандартный вывод, в противном случае дочерний и родительский элементы имеют один и тот же текст префикса в буфере, и оба будут печатать один и тот же префикс, когда он, наконец, сбросит его.,В конце концов, это совместное использование может запутать любого, кто пытается проанализировать вывод.

Примечание: после вызова exit стандартный вывод будет корректно сброшен.

Также обратите внимание, что различные распечатки могут бытьчередование.Помещая их в разные строки, с отличительным префиксом (таким как i и / или pid) может помочь отладка.

Посмотрите на этот пример выполнения

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