Fork System Call Linux

Fork System Call Linux



Gaffelsystemanropet brukes til å lage nye prosesser. Den nyopprettede prosessen er barneprosessen. Prosessen som kaller fork og skaper en ny prosess, er overordnet prosess. Barne- og foreldreprosessene utføres samtidig.

Men prosessene for barn og foreldre bor på forskjellige minneområder. Disse minneplassene har samme innhold, og uansett operasjon som utføres av den ene prosessen, vil det ikke påvirke den andre prosessen.







Når barnet prosesser er opprettet; nå vil begge prosessene ha den samme programtelleren (PC), så begge disse prosessene vil peke på den samme neste instruksjonen. Filene som åpnes av den overordnede prosessen, vil være de samme for barneprosessen.



Barneprosessen er nøyaktig den samme som forelder, men det er forskjell i prosess -ID -ene:



  1. Prosess -ID for barneprosessen er en unik prosess -ID som er forskjellig fra ID -ene til alle andre eksisterende prosesser.
  2. Foreldreprosess -ID -en vil være den samme som for prosess -ID -en til barnets forelder.

Egenskaper for barneprosess

Følgende er noen av egenskapene som en barneprosess innehar:





  1. CPU -tellerne og ressursutnyttelsene initialiseres for å tilbakestille til null.
  2. Når den overordnede prosessen avsluttes, mottar ikke underordnede prosesser noe signal fordi attributtet PR_SET_PDEATHSIG i prctl () er tilbakestilt.
  3. Tråden som brukes til å kalle fork () lager barneprosessen. Så adressen til barneprosessen vil være den samme som forelder.
  4. Filbeskrivelsen av overordnet prosess arves av barneprosessen. For eksempel vil forskyvningen av filen eller statusen til flagg og I/O -attributtene deles mellom filbeskrivelsene til underordnede og overordnede prosesser. Så filbeskrivelse for foreldreklasse vil referere til samme filbeskrivelse for barneklasse.
  5. De åpne meldingskøbeskrivelsene til overordnet prosess arves av den underordnede prosessen. For eksempel hvis en filbeskrivelse inneholder en melding i overordnet prosess, vil den samme meldingen være tilstede i den tilsvarende filbeskrivelsen for underordnet prosess. Så vi kan si at flaggverdiene til disse filbeskrivelsene er de samme.
  6. På samme måte arves åpne katalogstrømmer av de underordnede prosessene.
  7. Standard timerslakk -verdi for barneklassen er den samme som den gjeldende timerslakkverdien for foreldreklassen.

Egenskaper som ikke arves av barneprosessen

Følgende er noen av egenskapene som ikke arves av en underordnet prosess:

  1. Minnelåser
  2. Det ventende signalet fra en barneklasse er tomt.
  3. Behandle tilhørende postlåser (fcntl ())
  4. Asynkrone I/O -operasjoner og I/O -innhold.
  5. Katalogendringsvarsler.
  6. Tidtakere som alarm (), setitimer () arves ikke av barneklassen.

gaffel () i C

Det er ingen argumenter i fork () og returtypen gaffel () er heltall. Du må inkludere følgende overskriftsfiler når fork () brukes:



#inkludere
#inkludere
#inkludere

Når du arbeider med gaffel (), kan den brukes for type pid_t for prosesser ID -er som pid_t er definert i.

Toppfilen er der fork () er definert, så du må inkludere den i programmet for å bruke fork ().

Returtypen er definert i og fork () samtale er definert i. Derfor må du inkludere begge i programmet ditt for å bruke fork () systemanrop.

Syntaks for gaffel ()

Syntaksen for gaffel () 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 overordnet prosess og 0 vil bli returnert til selve barneprosessen.

Hvis det er en feil, returneres -1 til den overordnede prosessen, og den underordnede prosessen opprettes ikke.

No arguments are passed to fork(). 

Eksempel 1: Calling fork ()

Tenk på følgende eksempel der vi har brukt gaffel () systemanropet for å lage en ny underordnet prosess:

KODE:

#inkludere
#inkludere
#inkludere

inthoved-()
{
gaffel();
printf ('Bruker systemgaffel () n');
komme tilbake 0;
}

PRODUKSJON:

Bruker systemgaffel ()
Bruker systemgaffel ()

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 vil de resterende instruksjonene eller C -setningene bli utført det totale antallet prosess ganger, det vil si 2nganger, hvor n er antallet gaffel () systemanrop.

Så når gaffel () -anropet brukes en gang som ovenfor (21= 2) vi vil ha vår produksjon 2 ganger.

Her når gaffel () systemanropet brukes, vil den interne strukturen se slik ut:

Vurder følgende tilfelle der gaffelen () brukes 4 ganger:

KODE:

#inkludere
#inkludere
#inkludere

inthoved-()
{
gaffel();
gaffel();
gaffel();
gaffel();
printf ('Bruke gaffel () systemanrop');
komme tilbake 0;
}

Produksjon:

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 

Nå er det totale antallet prosesser som er opprettet 24= 16 og vi har utskriftserklæringen vår utført 16 ganger.

Eksempel 2: Testing av om gaffel () var vellykket

I det følgende eksemplet har vi brukt beslutningskonstruksjonen for å teste verdien (int) returnert av fork (). Og de tilsvarende meldingene vises:

KODE:

#inkludere
#inkludere
#inkludere

inthoved-()
{
pid_t s;
s=gaffel();
hvis(s== -1)
{
printf ('Det er en feil når du ringer til fork ()');
}
hvis(s==0)
{
printf ('Vi er i barneprosessen');
}
ellers
{
printf ('Vi er i foreldreprosessen');
}
komme tilbake 0;
}

PRODUKSJON:

Vi er i foreldreprosessen
Vi er i barneprosessen

I eksemplet ovenfor har vi brukt typen pid_t som lagrer returverdien til gaffel (). fork () kalles online:

s=gaffel();

Så heltallverdien som returneres av fork () lagres i p og deretter p sammenlignes for å sjekke om vårt gaffel () -anrop var vellykket.

Når gaffel () -anropet brukes og barnet er opprettet, vil ID -en til barneprosessen returneres til overordnet prosess og 0 vil bli returnert til barneprosessen. ID for barneprosess i selve barneprosessen. I barneprosessen vil ID -en til barneprosessen være 0.

Med denne opplæringen kan du se hvordan du kommer i gang med gaffelsystemanropet i linux.