Форк () в IF IFment в UNIX - PullRequest
       13

Форк () в IF IFment в UNIX

0 голосов
/ 13 февраля 2019

Что я понимаю в функции fork (), так это то, что после создания дочернего процесса он ничего не знает о коде, который был обработан до того момента, как мы достигли «fork ()».Но в случае, если для статов используется несколько fork (), кажется, что дочерний процесс выполняет вычисление аргумента, даже если он был до создания fork ().

Например:

int main ()
{
if((fork())==(fork()))
   printf ("Hello.\n");

printf ("Bye.\n");
return 1;
}

Тамбудет сумма 4 процесса, включая отца.В дочернем процессе (я буду называть его d), который был создан другим дочерним процессом, fork (), который создал наш процесс d, является вторым fork () в операторе if.

Несмотря на то, что первая функция fork () не должна быть знакома d, я понимаю, что процесс d вычисляет это 0 == 0 и выдает «Hello» (вывод верен) .IУ меня есть два вопроса:

1. Как получилось, что процесс d даже смог достичь первого fork () в операторе if, который был до fork (), который создал этот процесс d (второй)?

2. Почему в той точке, в которой мы находимся в процессе d, первый fork () равен 0, если это происходит только в дочернем процессе, созданном этим конкретным fork () (отцом d)?

1 Ответ

0 голосов
/ 13 февраля 2019

Что я понимаю в функции fork (), так это то, что, как только созданный дочерний процесс ничего не знает о коде, существовавшем до этого момента, мы достигли "fork ()".

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

Давайте перепишем вашу программу следующим образом:

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    pid_t a = fork();
    pid_t b = fork();
    if (a == b)
        printf ("Hello.\n");
    printf ("Bye.\n");
    return 1;
}

После разветвлений есть четыре процесса, исходныйодин имеет a != 0 && b != 0a != b, поскольку его два ребенка различны), два других имеют один из a и b ноль, а четвертый имеет a == b == 0.Последний является единственным, где a == b, так что выполняется условный вызов printf().

...