Próbuję nauczyć się programowania w systemie UNIX i napotkałem pytanie dotyczące fork (). Rozumiem, że fork () tworzy identyczny proces aktualnie uruchomionego procesu, ale od czego się zaczyna? Na przykład, jeśli mam kod
int main (int argc, char **argv)
{
int retval;
printf ("This is most definitely the parent process\n");
fflush (stdout);
retval = fork ();
printf ("Which process printed this?\n");
return (EXIT_SUCCESS);
}
Dane wyjściowe to:
Jest to zdecydowanie proces nadrzędny.
Który proces to wydrukował?
Który proces to wydrukował?
Myślałem, że fork()
tworzy ten sam proces, więc początkowo w tym programie fork()
wywołanie będzie rekurencyjnie wywoływane na zawsze. Wydaje mi się, że nowy proces utworzony od fork()
zaczyna się po fork()
połączeniu?
Jeśli dodam następujący kod, aby rozróżnić proces nadrzędny i podrzędny,
if (child_pid = fork ()) printf ("This is the parent, child pid is %d\n", child_pid);
else printf ("This is the child, pid is %d\n",getpid ());
gdzie po wywołaniu fork () proces potomny rozpoczyna wykonywanie?
man fork
z pewnością odpowie na twoje pytanie, btwOdpowiedzi:
Nowy proces zostanie utworzony w ramach
fork()
połączenia i rozpocznie się od powrotu z niego, podobnie jak rodzic. Zwracana wartość (z której zapisałeśretval
)fork()
to:Twój kod testowy działa poprawnie; przechowuje wartości zwracanej z
fork()
wchild_pid
i zastosowaniaif
w celu sprawdzenia, czy jest to 0 lub nie (choć nie sprawdza błędu)źródło
Tak. Policzmy linie:
Wykonanie jest następujące:
... co dokładnie wyjaśnia otrzymany wynik.
Jeśli chcesz wiedzieć, jak oryginalny i rozwidlony program może zachowywać się inaczej, ponieważ koniecznie mają ten sam kod, zobacz odpowiedź Michała Mrożka.
źródło
Prawdziwym rozwiązaniem tego jest
źródło
niezależnie od kodu zaraz po
fork()
, jest on kopiowany do procesu potomnego i nie mieszają procesu nadrzędnego i potomnego, są to dwie różne jednostki, które mają to samo (zduplikowane, niepodzielone) środowisko.Teraz zobacz swoje wyniki ...
źródło