Как будет напечатан вывод? - PullRequest
4 голосов
/ 26 февраля 2020

Я проводил некоторую трассировку по этому коду, и это закончилось печатью 4 операторов, 2 для родителя и 2 для ребенка, но мне интересно, как будет порядок? Я знаю, что это зависит от процессора и может отличаться от одного компьютера к другому, но какие будут возможные решения? Потому что я думал о 6 различных порядков этих утверждений могут появиться.

#include <stdio.h>
#include <sys/types.h> #include <unistd.h>

void forkExample()
{
    int z = 8;

    if (fork() == 0)
    {
        fork();
        printf("Child with z = %d\n", ++z);
    }
    else
    {
        fork();
        printf("Parent with z = %d\n", --z);
    }
}

int main()
{
    forkExample(); return 0;
}

1 Ответ

4 голосов
/ 26 февраля 2020

Нет последовательности между вызовами printf - ничто в коде не приводит к тому, что какой-либо из них в любом процессе запускается до или после любого другого. Поэтому любой из 4! = Возможно 24 заказа.

(Предполагается, что каждый вывод печатается полностью перед началом другого. Это не гарантируется C или Posix / Unix, но, скорее всего, с короткими текстами, использующими настройки буфера по умолчанию.)

Несмотря на то, что возможны 24 упорядочения фактических вызовов, некоторые сообщения неразличимы, поскольку они печатают один и тот же текст. Есть две пары одинаковых сообщений, поэтому количество различимых результатов составляет 24/2! / 2! = 6.

...