Простая часть CI не может иметь смысл - PullRequest
0 голосов
/ 25 января 2011

Извините за это, просто не могу понять, что происходит в этом маленьком кусочке C:

    #include <stdio.h>

    main()
    {
        int i;
        if (fork()) { /* must be the parent */
            for (i=0; i<1000; i++)
            printf("\t\t\tParent %d\n", i);
        }
        else { /* must be the child */
            for (i=0; i<1000; i++)
                printf("Child %d\n", i);
        }
    }

Насколько я понимаю, он будет печатать дочерний элемент 1000 раз, а родительский - 1000 раз, но, очевидно, это намного сложнее, и я должен полностью это понять! Может ли кто-нибудь объяснить это мне? Кроме того, как бы я изменил программу так, чтобы родитель и ребенок выполняли разные вычисления?

Большое спасибо за вашу помощь с этим:)

Ответы [ 3 ]

4 голосов
/ 25 января 2011

fork () создает новый процесс. Таким образом, с этого момента будут два отдельных процесса, которые продолжатся с той точки кода, где была fork (). В основном процессе fork () возвращает PID нового дочернего процесса, а в дочернем процессе возвращает ноль. Таким образом, код будет выполнять разные ветви оператора if в разных процессах.

Пожалуйста, помните, что новый процесс - это не то же самое, что поток. Эти процессы не будут иметь общих глобальных переменных или похожих вещей, но они полностью разделены. Но в остальном они идентичны.

1 голос
/ 25 января 2011

Функция fork() генерирует то, что называется дочерним процессом. Дочерний процесс - это клон процесса, который сначала называется fork(). Он даже начинает выполняться в том же месте, где остановился родительский процесс, то есть сразу после вызова fork().

Единственное отличие состоит в том, что fork() вернет true (или ноль) для родительского процесса и false (или не ноль) для дочернего процесса. Это означает, что родительский процесс после вызова fork() выполнит первую часть условия. Дочерний процесс начнет выполнение второй части условия.

Каждый из них будет напечатан 1000 раз, как это запланировано операционной системой, и каждый из них в конечном итоге прекратит работу, когда достигнет конца основного метода.

1 голос
/ 25 января 2011

Функция fork() порождает новый процесс с точной копией памяти исходного «родительского» процесса. Оба процесса продолжают выполняться с одной и той же точки, но fork() возвращает 0 для дочернего элемента и ненулевое значение для родительского элемента. Поэтому родительский цикл выполняет первый цикл, а дочерний - второй цикл.

Обратите внимание, что поскольку ничто не синхронизирует родительский и дочерний элементы, порядок отображения строк, отображаемых на экране, будет по существу случайным.

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