Gaffelsystemopkald
Gaffelsystemopkaldet bruges til at oprette nye processer. Den nyoprettede proces er barneprocessen. Processen, der kalder fork og skaber en ny proces, er den overordnede proces. Underordnede og forældre processer udføres samtidigt.
Men barnets og forældrenes processer ligger i forskellige hukommelsesrum. Disse hukommelsesrum har samme indhold, og uanset hvilken handling der udføres af en proces, påvirker det ikke den anden proces.
Når barnets processer oprettes; nu har begge processerne den samme programtæller (PC), så begge disse processer vil pege på den samme næste instruktion. De filer, der åbnes af den overordnede proces, er de samme for underordnet proces.
Barneprocessen er nøjagtig den samme som sin forælder, men der er forskel i processens id'er:
- Process-ID for barneprocessen er et unikt proces-ID, der adskiller sig fra ID'erne for alle andre eksisterende processer.
- Forældreproces-id'et er det samme som for proces-id'et for barnets forælder.
Egenskaber ved børneproces
Følgende er nogle af de egenskaber, som en underordnet proces har:
- CPU-tællerne og ressourceudnyttelsen initialiseres for at nulstille til nul.
- Når den overordnede proces afsluttes, modtager underordnede processer ikke noget signal, fordi PR_SET_PDEATHSIG attribut i prctl () nulstilles.
- Den tråd, der bruges til at kalde fork (), opretter underordnet proces. Så adressen på barneprocessen vil være den samme som forældrenes.
- Filbeskrivelsen for forældreprocessen arves af barneprocessen. For eksempel deles forskydningen af filen eller status for flag og I / O-attributter blandt filbeskrivelserne for underordnede og forældreprocesser. Så filbeskrivelse for overordnet klasse henviser til samme filbeskrivelse for underordnet klasse.
- De åbne beskedkøbeskrivere for forældreprocessen arves af barneprocessen. For eksempel, hvis en filbeskrivelse indeholder en besked i den overordnede proces, vil den samme besked være til stede i den tilsvarende filbeskrivelse for underordnet proces. Så vi kan sige, at flagværdierne for disse filbeskrivere er ens.
- Tilsvarende åbne biblioteksstrømme arves af underordnede processer.
- Standard-timerslack-værdien for underklassen er den samme som den aktuelle timer-slack-værdi for overordnet klasse.
Egenskaber, der ikke arves af Child-processen
Følgende er nogle af de egenskaber, der ikke nedarves af en underordnet proces:
- Hukommelseslåse
- Det ventende signal fra en barneklasse er tomt.
- Behandl tilknyttede postlåse (fcntl ())
- Asynkrone I / O-operationer og I / O-indhold.
- Underretninger om katalogændring.
- Timere som alarm (), setitimer () arves ikke af børneklassen.
gaffel () i C
Der er ingen argumenter i fork (), og returneringstypen af fork () er heltal. Du skal medtage følgende headerfiler, når fork () bruges:
#omfatte#omfatte
#omfatte
Når du arbejder med gaffel (),
Overskriftsfilen
Returtypen er defineret i
Gaffelsyntaks ()
Syntaksen for fork () systemopkald i Linux, Ubuntu er som følger:
pid_t gaffel (ugyldig);I syntaksen er returtypen pid_t. Når barneprocessen er oprettet med succes, returneres barneprocessens PID i den overordnede proces, og 0 returneres til selve barneprocessen.
Hvis der er nogen fejl, returneres -1 til den overordnede proces, og underprocessen oprettes ikke.
Ingen argumenter sendes til fork ().
Eksempel 1: Opkaldsgaffel ()
Overvej følgende eksempel, hvor vi har brugt fork () systemopkaldet til at oprette en ny underordnet proces:
KODE:
#omfatte#omfatte
#omfatte
int main ()
gaffel();
printf ("Brug af fork () systemopkald \ n");
returnere 0;
PRODUKTION:
Brug af fork () systemopkaldBrug af fork () systemopkald
I dette program har vi brugt fork (), dette vil skabe en ny underordnet proces. Når barneprocessen oprettes, vil både forældreprocessen og barneprocessen pege på den næste instruktion (samme programtæller). På denne måde udføres de resterende instruktioner eller C-sætninger det samlede antal procestider, dvs. 2n gange, hvor n er antallet af fork () systemopkald.
Så når fork () -opkaldet bruges en gang som ovenfor (21 = 2) vi har vores output 2 gange.
Her når fork () systemopkald bruges, vil den interne struktur se ud:
Overvej følgende tilfælde, hvor gaffelen () bruges 4 gange:
KODE:
#omfatte#omfatte
#omfatte
int main ()
gaffel();
gaffel();
gaffel();
gaffel();
printf ("Brug af fork () systemopkald");
returnere 0;
Produktion:
Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald Brug af fork () systemopkald
Nu er det samlede antal oprettede processer 24 = 16, og vi har udskriftserklæringen udført 16 gange.
Eksempel 2: Test om gaffel () var vellykket
I det følgende eksempel har vi brugt beslutningstagningskonstruktionen til at teste værdien (int) returneret af gaffel (). Og de tilsvarende meddelelser vises:
KODE:
#omfatte#omfatte
#omfatte
int main ()
pid_t p;
p = gaffel ();
hvis (p == - 1)
printf ("Der er en fejl under opkald til fork ()");
hvis (p == 0)
printf ("Vi er i barneprocessen");
andet
printf ("Vi er i den overordnede proces");
returnere 0;
PRODUKTION:
Vi er i forældreprocessenVi er i barneprocessen
I ovenstående eksempel har vi brugt typen pid_t, der gemmer returværdien af fork (). fork () kaldes online:
p = gaffel ();Så det heltal, der returneres af fork (), gemmes i p, og derefter sammenlignes p for at kontrollere, om vores fork () -opkald var vellykket.
Når fork () -opkaldet bruges, og barnet oprettes med succes, returneres id for barneprocessen til forældreprocessen, og 0 returneres til barneprocessen.ID for barneprocessen i forældreprocessen vil ikke være det samme som ID for barneprocessen i selve barneprocessen. I underordnet proces vil ID for barnets proces være 0.
Med denne vejledning kan du se, hvordan du kommer i gang med gaffelsystemopkaldet i linux.