Sistemski pozivi

Fork System Call Linux

Fork System Call Linux

Fork sustavni poziv

Sistemski poziv račvanja koristi se za stvaranje novih procesa. Novostvoreni postupak je podređeni proces. Proces koji poziva fork i stvara novi proces je nadređeni proces. Podređeni i roditeljski procesi izvršavaju se istovremeno.

Ali proces djeteta i roditelja nalazi se na različitim memorijskim prostorima. Ovi memorijski prostori imaju isti sadržaj i bilo koja operacija koju izvrši jedan proces neće utjecati na drugi proces.

Kada se kreira dijete; sada će oba procesa imati isti programski brojač (PC), pa će oba procesa ukazivati ​​na istu sljedeću uputu. Datoteke koje otvara nadređeni postupak bit će iste za podređeni postupak.

Podređeni proces je potpuno isti kao i njegov roditelj, ali postoji razlika u ID-ima procesa:

  1. ID procesa podređenog procesa jedinstveni je ID procesa koji se razlikuje od ID-a svih ostalih postojećih procesa.
  2. ID procesa roditelja bit će isti kao ID procesa roditelja djeteta.

Svojstva procesa djeteta

Slijede neka od svojstava koja podređeni proces posjeduje:

  1. Procesorski brojači i iskorištavanje resursa inicijaliziraju se da se resetiraju na nulu.
  2. Kad se nadređeni proces prekine, podređeni procesi ne primaju nikakav signal jer se resetira atribut PR_SET_PDEATHSIG u prctl ().
  3. Nit koja se koristi za pozivanje fork () stvara podređeni proces. Tako će adresa postupka djeteta biti ista kao adresa roditelja.
  4. Deskriptor datoteke nadređenog procesa nasljeđuje podređeni proces. Na primjer, pomak datoteke ili status zastavica i I / O atributi dijelit će se između deskriptora datoteka podređenih i roditeljskih procesa. Dakle, opis datoteke datoteke roditeljske klase odnosit će se na isti opis datoteke datoteke podređene klase.
  5. Deskriptori otvorenog reda poruka roditelja nadređeni su procesom naslijeđeni. Na primjer, ako opis datoteke sadrži poruku u nadređenom procesu, ista će poruka biti prisutna u odgovarajućem opisu datoteke podređenog procesa. Tako možemo reći da su vrijednosti zastavica ovih deskriptora datoteka jednake.
  6. Slično će otvorene tokove direktorija naslijediti podređeni procesi.
  7. Zadana vrijednost vremenskog popuštanja podređene klase jednaka je trenutnoj vrijednosti vremenskog popuštanja nadređene klase.

Svojstva koja se ne nasljeđuju postupkom Child

Slijede neka od svojstava koja podređeni proces ne nasljeđuje:

  1. Brave za memoriju
  2. Signal na čekanju podređene klase je prazan.
  3. Obradite zaključane zapise povezane (fcntl ())
  4. Asinkrone U / I operacije i U / I sadržaji.
  5. Obavijesti o promjeni direktorija.
  6. Podređena klasa ne nasljeđuje odbrojavanja poput alarma (), setitimer ().

vilica () u C

U fork () nema argumenata, a vrsta povrata fork () je cijeli broj. Kad se koristi fork (), morate uključiti sljedeće datoteke zaglavlja:

#include
#include
#include

Pri radu s vilicom (), može se koristiti za tip pid_t za ID-ove procesa kao što je pid_t definiran u .

Datoteka zaglavlja gdje je definirano fork (), tako da ga morate uključiti u svoj program da biste koristili fork ().

Vrsta povrata definirana je u i fork () poziv definiran je u . Stoga u svoj program morate uključiti oboje da biste koristili sistemski poziv fork ().

Sintaksa fork ()

Sintaksa sistemskog poziva fork () u Linuxu, Ubuntuu je sljedeća:

pid_t vilica (void);

U sintaksi je povratni tip pid_t. Kada se podređeni proces uspješno kreira, PID podređenog procesa vraća se u nadređenom procesu, a 0 će se vratiti u sam podređeni proces.

Ako postoji bilo kakva pogreška, tada se -1 vraća u nadređeni proces, a podređeni proces se ne kreira.

Nijedan argument se ne prosljeđuje fork (). 

Primjer 1: pozivanje vilice ()

Razmotrimo sljedeći primjer u kojem smo upotrijebili sistemski poziv fork () za stvaranje novog podređenog procesa:

KODIRATI:

#include
#include
#include
int main ()

vilica ();
printf ("Upotreba sistemskog poziva fork () \ n");
return 0;

IZLAZ:

Korištenje fork () sistemskog poziva
Upotreba sistemskog poziva fork ()

U ovom smo programu koristili fork (), to će stvoriti novi podređeni proces. Kada se kreira podređeni proces, i nadređeni i podređeni postupak ukazat će na sljedeću uputu (isti brojač programa). Na taj će se način izvršiti preostale upute ili C izrazi, ukupan broj puta procesa, odnosno 2n puta, gdje je n broj sistemskih poziva fork ().

Dakle, kada se fork () poziv koristi jednom, kao gore (21 = 2) izlaz ćemo imati 2 puta.

Ovdje će se, kada se koristi sistemski poziv fork (), unutarnja struktura izgledati ovako:

Razmotrimo sljedeći slučaj u kojem se vilica () koristi 4 puta:

KODIRATI:

#include
#include
#include
int main ()

vilica ();
vilica ();
vilica ();
vilica ();
printf ("Upotreba sistemskog poziva fork ()");
return 0;

Izlaz:

Korištenje sistemskog poziva fork () Korištenje sistemskog poziva fork () Korištenje sistemskog poziva fork () Korištenje sistemskog poziva fork () Korištenje sistemskog poziva fork () Korištenje sistemskog poziva fork () Korištenje sistemskog poziva fork () Korištenje sistemskog poziva fork () Korištenje sistemskog poziva fork () Korištenje sistemskog poziva fork () () sistemski poziv Korištenje fork () sistemski poziv Korištenje fork () sistemski poziv Korištenje fork () sistemski poziv Korištenje fork () sistemski poziv Korištenje fork () sistemski poziv Korištenje fork () sistemski poziv Korištenje fork () sistemski poziv 

Sada je ukupan broj stvorenih procesa 24 = 16, a ispis za ispis izvršen je 16 puta.

Primjer 2: Testiranje je li fork () bio uspješan

U sljedećem primjeru koristili smo konstrukt odlučivanja za testiranje vrijednosti (int) vraćene fork (). I prikazuju se odgovarajuće poruke:

KODIRATI:

#include
#include
#include
int main ()

pid_t p;
p = vilica ();
ako (p == - 1)

printf ("Došlo je do pogreške prilikom pozivanja fork ()");

ako (p == 0)

printf ("U procesu smo djeteta");

drugo

printf ("Mi smo u nadređenom procesu");

return 0;

IZLAZ:

Mi smo u roditeljskom procesu
Mi smo u procesu djeteta

U gornjem primjeru koristili smo tip pid_t koji će pohraniti povratnu vrijednost fork (). fork () se poziva na liniji:

p = vilica ();

Dakle, cjelobrojna vrijednost vraćena fork () pohranjuje se u p, a zatim se p uspoređuje kako bi se provjerilo je li naš poziv fork () bio uspješan.

Kada se koristi fork () i dijete se uspješno kreira, ID podređenog procesa vratit će se u nadređeni proces, a 0 će se vratiti u podređeni proces.ID dječjeg procesa u roditeljskom procesu neće biti isti kao ID dječjeg procesa u samom djetetovom procesu. U procesu djeteta ID procesa djeteta bit će 0.

Pomoću ovog vodiča možete vidjeti kako započeti sa sistemskim pozivom fork u Linuxu.

Dodajte geste miša u sustav Windows 10 pomoću ovih besplatnih alata
Posljednjih godina računala i operativni sustavi uvelike su se razvili. Bilo je vrijeme kada su korisnici morali koristiti naredbe za navigaciju kroz ...
Kontrolirajte i upravljajte kretanjem miša između više monitora u sustavu Windows 10
Dvostruki zaslon upravitelja miša omogućuje vam kontrolu i konfiguriranje kretanja miša između više monitora, usporavajući njegovo kretanje blizu gran...
WinMouse vam omogućuje prilagodbu i poboljšanje kretanja pokazivača miša na Windows računalu
Ako želite poboljšati zadane funkcije pokazivača miša, upotrijebite besplatni program WinMouse. Dodaje više značajki koje će vam pomoći da na najbolji...