Sistemski klici

Fork System Call Linux

Fork System Call Linux

Fork System Call

Sistemski klic vilic se uporablja za ustvarjanje novih procesov. Novo ustvarjeni postopek je podrejeni proces. Proces, ki pokliče fork in ustvari nov postopek, je nadrejeni postopek. Nadrejeni in nadrejeni proces se izvajata hkrati.

Toda proces otrok in staršev je v različnih pomnilniških prostorih. Ti pomnilniški prostori imajo enako vsebino in kakršna koli operacija, ki jo izvede en postopek, ne bo vplivala na drugi postopek.

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

Podrejeni proces je popolnoma enak nadrejenemu, vendar obstajajo razlike v ID-jih procesov:

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

Lastnosti otroškega procesa

Sledi nekaj lastnosti, ki jih ima podrejeni postopek:

  1. Števci CPU in izkoriščenost virov se inicializirajo, da se ponastavijo na nič.
  2. Ko se nadrejeni postopek zaključi, podrejeni procesi ne prejmejo nobenega signala, ker je ponastavljen atribut PR_SET_PDEATHSIG v prctl ().
  3. Nit, ki se uporablja za klic fork (), ustvari podrejeni postopek. Torej bo naslov otroškega postopka enak naslovu starša.
  4. Deskriptor datoteke nadrejenega procesa podeduje podrejeni proces. Na primer, odmik datoteke ali stanje zastavic in atributi V / I bodo deljeni med deskriptorji datotek podrejenih in nadrejenih procesov. Torej se bo opisnik datoteke nadrejenega razreda skliceval na isti opisnik datoteke nadrejenega razreda.
  5. Deskriptorje odprte vrstice 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 deskriptorju datoteke nadrejenega procesa. Tako lahko rečemo, da so vrednosti zastavic teh deskriptorjev datotek enake.
  6. Podobno bodo odprti tokovi imenikov podedovali podrejeni procesi.
  7. Privzeta vrednost ohlapnosti časovnika podrejenega razreda je enaka trenutni vrednosti ohlapnosti časovnika nadrejenega razreda.

Lastnosti, ki jih podedovan postopek ne podeduje

Sledi nekaj lastnosti, ki jih podedovan proces ne podeduje:

  1. Pomnilniške ključavnice
  2. Čakajoči signal podrejenega razreda je prazen.
  3. Obdelaj povezane blokade zapisov (fcntl ())
  4. Asinhrone V / I operacije in V / I vsebine.
  5. Obvestila o spremembi imenika.
  6. Časovniki, kot so alarm (), setitimer (), podrejeni razred ne podedujejo.

vilice () v C

V fork () ni argumentov, vrsta vrnitve fork () pa je celo število. Ko se uporablja fork (), morate vključiti naslednje datoteke glave:

#include
#include
#include

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

Datoteka glave tam je definirana fork (), zato jo morate vključiti v svoj program, če želite uporabiti fork ().

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

Sintaksa fork ()

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

vilice pid_t (void);

V sintaksi je vrsta vrnitve pid_t. Ko je podrejeni proces uspešno ustvarjen, se v nadrejenem procesu vrne PID nadrejenega procesa, 0 pa se vrne v sam podrejeni proces.

Če pride do napake, se -1 vrne v nadrejeni postopek in podrejeni postopek se ne ustvari.

V fork () niso posredovani nobeni argumenti. 

Primer 1: Klicanje vilic ()

Upoštevajte naslednji primer, v katerem smo uporabili sistemski klic fork () za ustvarjanje novega podrejenega procesa:

KODA:

#include
#include
#include
int main ()

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 postopek. Ko je nadrejeni postopek ustvarjen, bosta nadrejeni in podrejeni postopek pokazala na naslednje navodilo (isti števec programov). Na ta način bodo izvedena preostala navodila ali stavki C skupno število procesnih časov, to je 2n krat, kjer je n število sistemskih klicev fork ().

Torej, ko se enkrat uporabi klic fork (), kot je opisano zgoraj (21 = 2) izhod bomo imeli dvakrat.

Ko bo uporabljen sistemski klic fork (), bo notranja struktura videti tako:

Razmislite o naslednjem primeru, ko se vilice () uporabljajo štirikrat:

KODA:

#include
#include
#include
int main ()

vilice ();
vilice ();
vilice ();
vilice ();
printf ("Uporaba sistemskega klica fork ()");
vrnitev 0;

Izhod:

Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () () sistemski klic Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () Uporaba sistemskega klica fork () Sistemski klic fork () Sistemski klic fork () 

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

Primer 2: Testiranje, ali je bil fork () uspešen

V naslednjem primeru smo s konstruktom odločanja preizkusili vrednost (int), ki jo vrne fork (). In prikazana bodo ustrezna sporočila:

KODA:

#include
#include
#include
int main ()

pid_t p;
p = vilice ();
če (p == - 1)

printf ("Napaka med klicem fork ()");

če (p == 0)

printf ("Smo v otroškem procesu");

drugače

printf ("Smo v nadrejenem postopku");

vrnitev 0;

IZHOD:

Smo v starševskem postopku
Smo v otrokovem procesu

V zgornjem primeru smo uporabili vrsto pid_t, ki bo shranila vrnjeno vrednost fork (). fork () se pokliče v vrstici:

p = vilice ();

Torej je celoštevilčna vrednost, ki jo vrne fork (), shranjena v p in nato p primerjamo, da preverimo, ali je bil naš klic fork () uspešen.

Ko se uporabi klic fork () in se podrejeni sistem uspešno ustvari, se ID nadrejenega procesa vrne v nadrejeni postopek, 0 pa v podrejeni postopek.ID otroškega procesa v starševskem procesu ne bo enak ID otroškega procesa v samem otroškem procesu. V otroškem procesu bo ID otroškega procesa 0.

S to vadnico lahko vidite, kako začeti s sistemskim klicem fork v Linuxu.

Kako razviti igro na Linuxu
Pred desetletjem le malo uporabnikov Linuxa napoveduje, da bo njihov najljubši operacijski sistem nekoč priljubljena igralna platforma za komercialne ...
Odprtokodna vrata komercialnih igralnih sistemov
Brezplačne, odprtokodne in medplatformacijske igre, ki jih lahko uporabite za igranje starih, pa tudi nekaterih dokaj nedavnih naslovov iger. V tem čl...
Najboljše igre ukazne vrstice za Linux
Ukazna vrstica ni le vaš največji zaveznik pri uporabi Linuxa - lahko je tudi vir zabave, saj jo lahko uporabljate za igranje številnih zabavnih iger,...