Почему родительская печать 2 раза с fork в c

#c #unix #fork

#c #unix #fork

Вопрос:

Я изучаю fork () и пытаюсь создать небольшую программу, которая печатает дочерний элемент перед родительским. Это работает, но родители печатают 2 раза, и я не понимаю, почему.

Ожидаемый результат :

 4 5 6
1 2 3
  

Реальный результат :

 4 5 6
1 2 3
1 2 3
  

Вот мой код :

 int main (int argc, char** argv) {

    int childPid = fork();
    if (childPid == 0){
        printf("4 5 6n");
    }

    wait(NULL);

    printf("1 2 3n");
    exit(0);

}
  

Ответ №1:

Строка printf("1 2 3n"); будет выполнена как родителем, так и дочерним элементом. Дочерний элемент столкнется со wait(NULL); строкой, но пропустит ее, поскольку у него нет дочерних элементов, и напечатает «1 2 3», а затем завершит работу. Тем временем родительский элемент получит статус завершения дочернего элемента и продолжит выполнение, также напечатав «1 2 3» и завершив работу. Чтобы заставить его работать должным образом, отредактируйте его соответствующим образом:

 int main (int argc, char** argv) {

    int childPid = fork();
    if (childPid == 0){
        printf("4 5 6n");
        exit(0);
    }

    wait(NULL);

    printf("1 2 3n");
    exit(0);

}