Fork System Call Linux

Fork System Call Linux



Sistemski klic vilic se uporablja za ustvarjanje novih procesov. Novonastali proces je podrejeni proces. Proces, ki kliče vilice in ustvari nov proces, je nadrejeni proces. Otroški in nadrejeni proces se izvajata istočasno.

Otroški in starševski procesi pa se nahajajo v različnih pomnilniških prostorih. Ti pomnilniški prostori imajo enako vsebino in vse operacije, ki jih izvede en proces, ne bodo vplivale na drugi proces.







Ko se ustvarjajo otroški procesi; zdaj bosta oba procesa imela isti programski števec (PC), zato bosta oba procesa kazala na isto naslednje navodilo. Datoteke, ki jih odpre nadrejeni proces, bodo enake za podrejeni proces.



Podrejeni proces je popolnoma enak njegovemu staršu, vendar obstajajo razlike v ID -jih procesov:



  1. ID procesa podrejenega procesa je edinstven ID procesa, ki se razlikuje od ID -ja vseh drugih obstoječih procesov.
  2. ID starševskega procesa bo enak ID -ju procesa otrokovega starša.

Lastnosti otroškega procesa

Spodaj je nekaj lastnosti, ki jih ima podrejeni proces:





  1. Števci procesorja in poraba virov se inicializirajo, da se ponastavijo na nič.
  2. Ko se nadrejeni proces zaključi, podrejeni procesi ne prejmejo nobenega signala, ker je atribut PR_SET_PDEATHSIG v prctl () ponastavljen.
  3. Nit, ki se uporablja za klic fork (), ustvari podrejeni proces. Naslov otroškega procesa bo torej enak kot naslov starša.
  4. Deskriptor datoteke nadrejenega procesa podeduje podrejeni proces. Na primer, odmik datoteke ali statusa zastavic in V/I atributov bo deljen med deskriptorji datotek podrejenih in nadrejenih procesov. Tako se bo deskriptor datoteke nadrejenega razreda skliceval na isti opisnik datoteke podrejenega razreda.
  5. Deskriptorje čakalne vrste odprtih sporočil nadrejenega procesa podeduje podrejeni proces. Na primer, če deskriptor datoteke vsebuje sporočilo v nadrejenem procesu, bo isto sporočilo prisotno v ustreznem opisniku datoteke podrejenega procesa. Tako lahko rečemo, da so vrednosti zastavic teh deskriptorjev datotek enake.
  6. Podobno bodo odprti imeniški tokovi podedovali podrejeni procesi.
  7. Privzeta vrednost ohlapnosti časovnika podrejenega razreda je enaka trenutni vrednosti ohlapnosti časovnika nadrejenega razreda.

Lastnosti, ki jih ne podeduje podrejeni proces

Spodaj je nekaj lastnosti, ki jih podeduje proces:

  1. Zaklepanje pomnilnika
  2. Čakajoči signal podrejenega razreda je prazen.
  3. Obdelajte zaklepanje zapisov (fcntl ())
  4. Asinhrone V/I operacije in V/I vsebina.
  5. Obvestila o spremembah imenika.
  6. Časovnika, kot sta alarm (), setitimer (), ne podeduje podrejeni razred.

vilice () v C

V fork () ni argumentov, vrsta vrnitve fork () pa je celo število. Pri uporabi fork () morate vključiti naslednje datoteke z glavo:



#vključi
#vključi
#vključi

Pri delu z vilicami () se lahko uporabi za tip pid_t za ID -je procesov kot je pid_t definiran v.

Datoteka glave je tam, kjer je definiran fork (), zato ga morate za uporabo fork () vključiti v svoj program.

Vrsta vrnitve je definirana v in klic fork () je definiran v. Zato morate za uporabo sistemskega klica fork () v program vključiti oboje.

Sintaksa vilice ()

Sintaksa sistemskega klica fork () v Linuxu, Ubuntu je naslednja:

vilice pid_t (void);

Vrsta v sintaksi je pid_t . Ko je podrejeni proces uspešno ustvarjen, se v nadrejenem procesu vrne PID podrejenega procesa, 0 pa se vrne v sam podrejeni proces.

Če pride do napake, se -1 vrne v nadrejeni proces, podrejeni proces pa ni ustvarjen.

No arguments are passed to fork(). 

Primer 1: klicne vilice ()

Razmislite o naslednjem primeru, v katerem smo za ustvarjanje novega podrejenega procesa uporabili sistemski klic fork ():

KODA:

#vključi
#vključi
#vključi

intglavni()
{
vilice();
printf ('Uporaba sistemskega klica fork () n');
vrnitev 0;
}

IZHOD:

Uporaba sistemskega klica fork ()
Uporaba sistemskega klica fork ()

V tem programu smo uporabili fork (), to bo ustvarilo nov podrejeni proces. Ko je ustvarjen podrejeni proces, bosta nadrejeni in podrejeni proces kazala na naslednje navodilo (isti števec programov). Na ta način se izvedejo preostala navodila ali stavki C skupno število procesov, to je 2nkrat, kjer je n število sistemskih klicev fork ().

Ko se torej klic fork () uporabi enkrat, kot je opisano zgoraj (21= 2) rezultat bomo imeli 2 -krat.

Tukaj, ko se uporabi sistemski klic fork (), bo notranja struktura videti tako:

Razmislite o naslednjem primeru, v katerem se vilice () uporabijo 4 -krat:

KODA:

#vključi
#vključi
#vključi

intglavni()
{
vilice();
vilice();
vilice();
vilice();
printf ('Uporaba sistemskega klica fork ()');
vrnitev 0;
}

Izhod:

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 

Zdaj je skupno število ustvarjenih procesov 24= 16 in imamo našo izjavo za tiskanje izvedeno 16 -krat.

Primer 2: Preverjanje, ali je bila vilica () uspešna

V naslednjem primeru smo uporabili konstrukt odločanja za preizkus vrednosti (int), ki jo vrne fork (). Prikažejo se ustrezna sporočila:

KODA:

#vključi
#vključi
#vključi

intglavni()
{
pid_t p;
str=vilice();
če(str== -1)
{
printf ('Pri klicanju fork () je prišlo do napake');
}
če(str==0)
{
printf ('Smo v procesu otroka');
}
drugače
{
printf ('Smo v starševskem procesu');
}
vrnitev 0;
}

IZHOD:

Smo v postopku starševstva
Smo v procesu otroka

V zgornjem primeru smo uporabili tip pid_t, ki bo shranjeval vrnjeno vrednost fork (). fork () se pokliče na spletu:

str=vilice();

Tako je celo število, ki ga vrne fork (), shranjeno v p, nato pa p primerjamo, da preverimo, ali je bil klic fork () uspešen.

Ko se uporabi klic fork () in je otrok uspešno ustvarjen, se ID podrejenega procesa vrne v nadrejeni proces, 0. pa v podrejeni proces. ID podrejenega procesa v starševskem procesu ne bo enak kot ID otroškega procesa v samem otroškem procesu. V podrejenem procesu bo ID podrejenega procesa 0.

S to vadnico si lahko ogledate, kako začeti s sistemskim klicem fork v linuxu.