Den gaffel funksjon er en del av de vanlige UNIX systemkall ( POSIX standard ). Denne funksjonen lar en prosess (et pågående program) føde en ny prosess som er karbonkopien, for eksempel med tanke på å utføre en andre prosessering parallelt med den første. En god måte å visualisere effekten av en gaffel på en prosess er å forestille seg celledeling .
Det er foreldre i prosesser: skaperen av en ny prosess kalles faren og den nye prosessen kalles sønnen. De fleste av foreldrenes systemattributter (f.eks. Filsystemrettigheter) overføres til barnet, på samme måte som arv . Når du starter et Unix-system, eksisterer bare en prosess (nummer 1). Alle andre fremgangsmåter som kan forekomme i løpet av systemets levetid stammer fra denne første prosess, som kalles initvia systemkall som fork, vfork, posix_spawneller andre midler. På de første UNIX-ene er det bare systemanropet som forklar deg lage nye prosesser.
Gaffelsystemanropet gir en resultatverdi som er heltall. For å identifisere faren til det nyopprettede barnet, er det bare å se på returverdien til gaffelen (). Dette kan være barnets PID, i så fall er vi i foreldreprosessen, eller 0 i så fall er vi i barneprosessen. Gaffelen () kan også returnere verdien -1, som indikerer en feil under utførelsen av kommandoen.
For å få prosessnummeret er det bare å ringe getpid (), eller getppid () systemanrop for å få foreldrenummeret.
Det er mulig å samhandle mellom prosesser på flere forskjellige måter. Først kan vi sende signaler. På kommandospråk kan kill <pid> drepe prosessen som har for pid det man skriver inn i kommandoen.
Det er mulig å få en prosess til å vente ved å bruke hvilemodus (n) for å blokkere prosessen i n sekunder, eller ved å bruke pause () som blokkerer til et signal mottas.
For å avslutte en prosess, kan du bruke exit (state) og vite at tilstanden er en sluttkode, ved konvensjon 0 hvis ok, feilkode ellers.
Det kan være veldig praktisk for faren å vente på slutten av et av barna sine . For å gjøre dette bruker vi pid_t wait (int * ptr_etat) som gir som returverdi pid til barnet som er ferdig, og sluttkoden er lagret i ptr_etat.
Vi kan også vente på slutten av barnet takket være pid : pid_t waitpid (pid_t pid, int * ptr_etat, int options).
Et vanlig begrep i "System" -delen av databehandling er det som kalles zombieprosesser . Dette skjer når prosessen er fullført, men faren ikke har ventet på sønnen, det vil si at han ikke har ringt for å vente () . Dette er en situasjon som absolutt bør unngås fordi prosessen ikke lenger kan kjøre, men likevel bruker ressurser.
Hver prosess på en gaffel har sin egen adresseplass, som er dyr å duplisere, selv med triks som copy-on-write . Noen ganger lønner det seg å erstatte gafler med tråder (lette prosesser) som deler samme minne ... på programmererens egen risiko.
Den gaffel funksjon er mye brukt i klient-tjener-applikasjoner med flere samtidige klienter.