Fork System Call Linux

Fork System Call Linux



Gaffelsystemopkaldet bruges til at oprette nye processer. Den nyoprettede proces er barneprocessen. Processen, der kalder fork og skaber en ny proces, er forældreprocessen. Barnet og forældrenes processer udføres samtidigt.

Men barnets og forældrenes processer ligger på forskellige hukommelsesrum. Disse hukommelsesrum har samme indhold, og uanset hvilken handling der udføres af den ene proces, påvirker den anden proces ikke.







Når barnets processer oprettes; nu vil begge processer have den samme Program Counter (PC), så begge disse processer vil pege på den samme næste instruktion. Filerne, der åbnes af den overordnede proces, er de samme for børneprocessen.



Børneprocessen er nøjagtig den samme som sin forælder, men der er forskel på proces -ID’erne:



  1. Proces -id'et for barneprocessen er et unikt proces -ID, der adskiller sig fra ID'erne for alle andre eksisterende processer.
  2. Forælderproces -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 ressourceudnyttelserne initialiseres til nulstilling.
  2. Når den overordnede proces afsluttes, modtager underordnede processer ikke noget signal, fordi attributten PR_SET_PDEATHSIG i prctl () nulstilles.
  3. Tråden, der bruges til at kalde fork () skaber barneprocessen. Så adressen på barneprocessen vil være den samme som forældrenes.
  4. Filbeskrivelsen til den overordnede proces arves af den underordnede proces. For eksempel vil forskydningen af ​​filen eller status for flag og I/O -attributter blive delt mellem filbeskrivelserne for underordnede og overordnede processer. Så filbeskrivelse af forældreklasse vil referere til samme filbeskrivelse for underordnet klasse.
  5. De åbne beskedkøbeskrivere af forældreprocessen arves af den underordnede proces. For eksempel hvis en filbeskrivelse indeholder en besked i forældreprocessen, vil den samme meddelelse være til stede i den tilsvarende filbeskrivelse af underordnet proces. Så vi kan sige, at flagværdierne for disse filbeskrivelser er de samme.
  6. På samme måde arves åbne biblioteksstrømme af de underordnede processer.
  7. Standardværdien for timerslack i underordnet klasse er den samme som den aktuelle timer -slack -værdi for forældreklassen.

Egenskaber, der ikke er arvet af underordnet proces

Følgende er nogle af de egenskaber, der ikke arves af en underordnet proces:

  1. Hukommelseslåse
  2. Det ventende signal fra en børneklasse er tomt.
  3. Behandle tilknyttede registreringslåse (fcntl ())
  4. Asynkrone I/O -operationer og I/O -indhold.
  5. Underretninger om ændring af telefonbogen.
  6. Timere som alarm (), setitimer () arves ikke af børneklassen.

gaffel () i C

Der er ingen argumenter i fork (), og returtypen for gaffel () er et helt tal. Du skal inkludere følgende header -filer, når fork () bruges:



#omfatte
#omfatte
#omfatte

Ved arbejde med gaffel (), kan bruges til type pid_t for processer ID'er som pid_t er defineret i.

Header -filen er, hvor fork () er defineret, så du skal inkludere den i dit program for at bruge fork ().

Returtypen defineres i og fork () opkald defineres i. Derfor skal du inkludere begge i dit program for at bruge fork () systemopkald.

Syntaks for gaffel ()

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, returneres PID for barneprocessen i den overordnede proces, og 0 returneres til selve barneprocessen.

Hvis der er en fejl, returneres -1 til den overordnede proces, og den underordnede proces oprettes ikke.

No arguments are passed to 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

intvigtigste()
{
gaffel();
printf ('Ved hjælp af gaffel () systemopkald n');
Vend tilbage 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 er oprettet, peger både forældreprocessen og barneprocessen på den næste instruktion (samme programtæller). På denne måde vil de resterende instruktioner eller C -sætninger blive udført det samlede antal procestider, det vil sige 2ngange, hvor n er antallet af gaffel () systemopkald.

Så når gaffel () opkaldet bruges en gang som ovenfor (21= 2) vi vil have vores output 2 gange.

Når gaffel () systemopkaldet bruges, ser den interne struktur således ud:

Overvej følgende tilfælde, hvor gaflen () bruges 4 gange:

KODE:

#omfatte
#omfatte
#omfatte

intvigtigste()
{
gaffel();
gaffel();
gaffel();
gaffel();
printf ('Brug af fork () systemopkald');
Vend tilbage 0;
}

Produktion:

Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call 

Nu er det samlede antal oprettede proces 24= 16, og vi har vores udskriftserklæring udført 16 gange.

Eksempel 2: Test om gaffel () lykkedes

I det følgende eksempel har vi brugt beslutningskonstruktionen til at teste værdien (int) returneret af fork (). Og de tilsvarende meddelelser vises:

KODE:

#omfatte
#omfatte
#omfatte

intvigtigste()
{
pid_t s;
s. s=gaffel();
hvis(s. s== -1)
{
printf ('Der er en fejl under opkald til fork ()');
}
hvis(s. s==0)
{
printf ('Vi er i barneprocessen');
}
andet
{
printf ('Vi er i forældreprocessen');
}
Vend tilbage 0;
}

PRODUKTION:

Vi er i forældreprocessen
Vi er i barneprocessen

I ovenstående eksempel har vi brugt typen pid_t, som gemmer returværdien af ​​fork (). fork () kaldes online:

s. s=gaffel();

Så heltalsværdien returneret af fork () gemmes i p, og derefter p sammenlignes for at kontrollere, om vores fork () -opkald var vellykket.

Når gaffel () -kaldet bruges, og barnet er oprettet med succes, returneres id'et til underordnet proces til forældreprocessen, og 0 returneres til barneprocessen. ID for børneprocessen i selve barneprocessen. I børneprocessen vil ID'et for børneprocessen være 0.

Med denne vejledning kan du se, hvordan du kommer i gang med gaffelsystemopkaldet i linux.