Systemopkald

Gaffelsystemkald Linux

Gaffelsystemkald Linux

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:

  1. Process-ID for barneprocessen er et unikt proces-ID, der adskiller sig fra ID'erne for alle andre eksisterende processer.
  2. 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:

  1. CPU-tællerne og ressourceudnyttelsen initialiseres for at nulstille til nul.
  2. Når den overordnede proces afsluttes, modtager underordnede processer ikke noget signal, fordi PR_SET_PDEATHSIG attribut i prctl () nulstilles.
  3. Den tråd, der bruges til at kalde fork (), opretter underordnet proces. Så adressen på barneprocessen vil være den samme som forældrenes.
  4. 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.
  5. 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.
  6. Tilsvarende åbne biblioteksstrømme arves af underordnede processer.
  7. 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:

  1. Hukommelseslåse
  2. Det ventende signal fra en barneklasse er tomt.
  3. Behandl tilknyttede postlåse (fcntl ())
  4. Asynkrone I / O-operationer og I / O-indhold.
  5. Underretninger om katalogændring.
  6. 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 (), kan bruges til type pid_t til processer er id'er som pid_t defineret i .

Overskriftsfilen er hvor fork () er defineret, så du skal inkludere det i dit program for at bruge fork ().

Returtypen er defineret i og fork () kald er defineret i . Derfor skal du medtage begge dele i dit program for at bruge fork () systemopkald.

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 () systemopkald
Brug 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ældreprocessen
Vi 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.

Gratis og open source-spilmotorer til udvikling af Linux-spil
Denne artikel dækker en liste over gratis og open source-spilmotorer, der kan bruges til at udvikle 2D- og 3D-spil på Linux. Der er mange sådanne spil...
Shadow of the Tomb Raider til Linux-vejledning
Shadow of the Tomb Raider er den tolvte tilføjelse til Tomb Raider-serien - en action-adventure-spilfranchise oprettet af Eidos Montreal. Spillet blev...
Sådan styrkes FPS i Linux?
FPS står for Billeder i sekundet. FPS's opgave er at måle billedhastigheden i videoafspilninger eller spiloptræden. I enkle ord betegnes antallet af u...