Gaffelsystemanrop
Gaffelsystemanropet brukes til å lage nye prosesser. Den nyopprettede prosessen er barneprosessen. Prosessen som kaller gaffel og skaper en ny prosess er foreldreprosessen. Barn- og foreldreprosessene utføres samtidig.
Men prosessene for barn og foreldre ligger i forskjellige hukommelsesrom. Disse minneområdene har samme innhold, og uansett hvilken operasjon som utføres av en prosess, påvirker ikke den andre prosessen.
Når barnet behandler er skapt; nå vil begge prosessene ha samme programteller (PC), så begge disse prosessene vil peke på samme neste instruksjon. Filene som er åpnet av foreldreprosessen, vil være de samme for barneprosessen.
Barneprosessen er nøyaktig den samme som foreldrene, men det er forskjell i prosess-ID-ene:
- Prosess-ID-en for barneprosessen er en unik prosess-ID som er forskjellig fra ID-ene til alle andre eksisterende prosesser.
- Foreldreprosess-ID vil være den samme som for prosess-IDen til barnets foreldre.
Egenskaper ved barneprosess
Følgende er noen av egenskapene som en barneprosess har:
- CPU-tellere og ressursutnyttingene initialiseres for å nullstille.
- Når foreldreprosessen avsluttes, mottar ikke underordnede prosesser noe signal fordi PR_SET_PDEATHSIG-attributtet i prctl () tilbakestilles.
- Tråden som brukes til å ringe fork () skaper barneprosessen. Så adressen til barneprosessen vil være den samme som foreldrenes.
- Filbeskrivelsen for foreldreprosessen arves av barneprosessen. For eksempel vil forskyvningen av filen eller flaggstatusen og I / O-attributtene deles mellom filbeskrivelsene til barn og foreldreprosesser. Så filbeskrivelse for overordnet klasse vil referere til samme filbeskrivelse for barneklasse.
- De åpne meldings-købeskrivelsene for foreldreprosessen arves av barneprosessen. For eksempel hvis en filbeskrivelse inneholder en melding i foreldreprosessen, vil den samme meldingen være tilstede i den tilsvarende filbeskrivelsen for barneprosessen. Så vi kan si at flaggverdiene til disse filbeskrivelsene er de samme.
- Tilsvarende åpne katalogstrømmer vil arves av underordnede prosesser.
- Standardverdien for timer-slakk i underklassen er den samme som gjeldende timer-slakk-verdi for overordnet klasse.
Egenskaper som ikke arves av Child-prosessen
Følgende er noen av egenskapene som ikke arves av en underordnet prosess:
- Minnelås
- Det ventende signalet fra en barneklasse er tomt.
- Behandle tilknyttede postlåser (fcntl ())
- Asynkrone I / O-operasjoner og I / O-innhold.
- Katalogendringsvarsler.
- Timere som alarm (), setitimer () arves ikke av barneklassen.
gaffel () i C
Det er ingen argumenter i gaffel (), og returtype gaffel () er heltall. Du må ta med følgende overskriftsfiler når fork () brukes:
#inkludere#inkludere
#inkludere
Når du arbeider med gaffel (),
Overskriftsfilen
Returtypen er definert i
Syntaks for gaffel ()
Syntaksen for fork () systemanrop i Linux, Ubuntu er som følger:
pid_t gaffel (ugyldig);I syntaksen er returtypen pid_t. Når barneprosessen er opprettet, returneres PID for barneprosessen i foreldreprosessen, og 0 vil bli returnert til selve barneprosessen.
Hvis det er noen feil, returneres -1 til foreldreprosessen, og barneprosessen blir ikke opprettet.
Ingen argumenter sendes til gaffel ().
Eksempel 1: Ringgaffel ()
Tenk på følgende eksempel der vi har brukt fork () systemanropet for å lage en ny underordnet prosess:
KODE:
#inkludere#inkludere
#inkludere
int main ()
gaffel();
printf ("Bruke gaffel () systemanrop \ n");
retur 0;
PRODUKSJON:
Bruker gaffel () systemanropBruker gaffel () systemanrop
I dette programmet har vi brukt fork (), dette vil skape en ny barneprosess. Når barneprosessen er opprettet, vil både foreldreprosessen og barneprosessen peke på neste instruksjon (samme programteller). På denne måten blir de gjenværende instruksjonene eller C-setningene utført totalt antall prosess ganger, det vil si 2n ganger, hvor n er antall fork () systemanrop.
Så når fork ((call) brukes en gang som ovenfor (21 = 2) vi vil ha produksjonen vår to ganger.
Her når gaffel () systemanrop brukes, vil den interne strukturen se ut som:
Vurder følgende tilfelle der gaffelen () brukes fire ganger:
KODE:
#inkludere#inkludere
#inkludere
int main ()
gaffel();
gaffel();
gaffel();
gaffel();
printf ("Bruke gaffel () systemanrop");
retur 0;
Produksjon:
Bruke gaffel () systemanrop Bruke gaffel () systemanrop Bruk gaffel () systemanrop Bruke gaffel () systemanrop Bruke gaffel () systemanrop Bruke gaffel () systemanrop Bruke gaffel () systemanrop Bruke gaffel () systemanrop Bruke gaffel () systemanrop Bruk gaffel () systemanrop Bruk gaffel () systemanrop Bruke gaffel () systemanrop Bruke gaffel () systemanrop Bruke gaffel () systemanrop Bruke gaffel () systemanrop Bruke gaffel () systemanrop
Nå er totalt antall prosesser som er opprettet 24 = 16 og vi har utskriftserklæringen utført 16 ganger.
Eksempel 2: Testing om gaffel () var vellykket
I det følgende eksemplet har vi brukt beslutningskonstruksjonen for å teste verdien (int) som returneres av gaffel (). Og de tilsvarende meldingene vises:
KODE:
#inkludere#inkludere
#inkludere
int main ()
pid_t p;
p = gaffel ();
hvis (p == - 1)
printf ("Det er en feil mens du ringer til fork ()");
hvis (p == 0)
printf ("Vi er i barneprosessen");
ellers
printf ("Vi er i foreldreprosessen");
retur 0;
PRODUKSJON:
Vi er i foreldreprosessenVi er i barneprosessen
I eksemplet ovenfor har vi brukt typen pid_t som vil lagre returverdien til gaffelen (). gaffel () kalles online:
p = gaffel ();Så helverdien som returneres av gaffel () lagres i p, og deretter sammenlignes p for å sjekke om gaffel () -anropet vårt var vellykket.
Når fork () -anropet brukes og barnet er opprettet vellykket, vil ID-en for barneprosessen returneres til foreldreprosessen og 0 vil bli returnert til barneprosessen.ID-en for barneprosessen i foreldreprosessen vil ikke være den samme som ID-en for barneprosessen i selve barneprosessen. I barneprosessen vil ID for barneprosessen være 0.
Med denne veiledningen kan du se hvordan du kommer i gang med gaffelsystemanropet i Linux.