Najlepsze pytania
Chronologia
Czat
Perspektywa

Fork (Unix)

Z Wikipedii, wolnej encyklopedii

Remove ads

forkfunkcja systemowa w systemach operacyjnych Unix (i uniksopodobnych) powodująca, że proces wywołujący tę funkcję ulega w chwili jej wywołania podziałowi (albo „rozwidleniu”, ang. fork) na dwa procesy (innymi słowy – tworzony jest nowy proces). O jednym z tych procesów mówi się „proces-rodzic” (ang. parent process) a o drugim – „proces potomny” (lub czasem „potomek”, „proces-dziecko”, ang. child process)[1].

Remove ads

Działanie

Podsumowanie
Perspektywa

W chwili utworzenia, proces-dziecko jest kopią procesu-rodzica (kopiowane są obszary pamięci, wartości zmiennych i część środowiska). Co więcej, po wywołaniu funkcji fork(), wykonywany jest dalej ten sam kod w przypadku zarówno procesu-rodzica i procesu-dziecka. Aby umożliwić zróżnicowanie dalszego działania obu procesów, konieczne jest ustalenie, który z nich jest dzieckiem, a który rodzicem. W tym celu testuje się wartość zwracaną przez funkcję fork() (która jest liczbą całkowitą).

Tu możliwe są trzy przypadki:

Remove ads
  • Jeśli wartość zwracana wynosi -1 oznacza to, że proces sprawdzający wartość zwracaną to proces-rodzic, ale nie udało się stworzyć procesu potomnego (dziecka),
  • Jeśli wartość zwracana wynosi 0 oznacza to, że proces sprawdzający wartość zwracaną to proces-dziecko,
  • Jeśli wartość zwracana jest liczbą dodatnią oznacza to, że proces sprawdzający wartość zwracaną to proces-rodzic, którego potomek ma identyfikator PID równy tej właśnie liczbie.

Podjęcie dalszych działań w procesie jest uzależnione od wartości wyniku. W treści programu, który uległ rozwidleniu zawarty jest zazwyczaj kod procesu-rodzica jak i procesu potomnego (lecz mogą działać wówczas inne procedury – np. proces-dziecko może być zależne w swoich działaniach od procesu rodzica).

Remove ads

W wielu przypadkach po wywołaniu funkcji fork() następuje szybkie wywołanie funkcji systemowej exec() (uruchamiającej nową aplikację).

Przykład

Fragment przykładowego kodu w C używającego funkcji fork():

 
switch(fork())
{
  case -1:
    //jesteśmy w rodzicu, ale operacja się nie udała
    break;
 
  case 0:
    //jesteśmy w dziecku
    break;

  default:
    //jesteśmy w rodzicu
    break;
}

Dyskusja

Współcześnie w środowisku twórców systemów operacyjnych funkcja fork() uchodzi za funkcję z wielu względów niedoskonałą; stwierdza się np., że fork() powstał jako metoda prowizoryczna (ang. hack). Stąd pojawiają głosy, by funkcja została zastąpiona innymi mechanizmami zarządzania cyklem życia procesu[2].

Przypisy

Zobacz też

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads