Fork System Call Linux

Fork System Call Linux



Poziv sustava fork koristi se za stvaranje novih procesa. Novostvoreni proces je podređeni proces. Proces koji poziva fork i stvara novi proces je roditeljski proces. Podređeni i roditeljski procesi izvode se istodobno.

No, proces djeteta i roditelja nalazi se na različitim memorijskim prostorima. Ti memorijski prostori imaju isti sadržaj i bilo koja operacija koju izvede jedan proces neće utjecati na drugi proces.







Kad se stvaraju djetetovi procesi; sada će oba procesa imati isti programski brojač (PC), pa će oba procesa ukazati na istu sljedeću instrukciju. Datoteke koje je otvorio nadređeni proces bit će iste za podređeni proces.



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



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

Svojstva procesa djeteta

Slijede neka od svojstava koja podređeni proces posjeduje:





  1. Brojači CPU -a i iskorištenost resursa inicijalizirani su za vraćanje na nulu.
  2. Kad se roditeljski proces završi, podređeni procesi ne primaju nikakav signal jer se atribut PR_SET_PDEATHSIG u prctl () poništava.
  3. Nit koja se koristi za pozivanje fork () stvara podređeni proces. Tako će adresa podređenog procesa biti ista kao i 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 među opisima datoteka podređenih i nadređenih procesa. Tako će se deskriptor datoteke roditeljske klase odnositi na isti deskriptor datoteke podređene klase.
  5. Opisi reda otvorenih poruka roditeljskog procesa nasljeđuju podređeni proces. Na primjer, ako deskriptor datoteke sadrži poruku u roditeljskom procesu, ista će poruka biti prisutna u odgovarajućem opisu datoteke podređenog procesa. Dakle, možemo reći da su vrijednosti zastavica ovih deskriptora datoteka iste.
  6. Slično će otvoreni tokovi direktorija naslijediti podređeni procesi.
  7. Zadana vrijednost popuštanja mjerača vremena podređene klase ista je kao i trenutna vrijednost zastoja mjerača vremena roditeljske klase.

Svojstva koja nisu naslijeđena Child procesom

Slijede neka od svojstava koja nisu naslijeđena podređenim procesom:

  1. Zaključavanje memorije
  2. Signal na čekanju za podređenu klasu je prazan.
  3. Obradi zaključane zapise (fcntl ())
  4. Asinkrone I/O operacije i I/O sadržaj.
  5. Obavijesti o promjenama imenika.
  6. Mjerači vremena kao što su alarm (), setitimer () nisu naslijeđeni podređenom klasom.

vilica () u jeziku C

U argumentu fork () nema argumenata, a povratni tip fork () je cijeli broj. Kada se koristi fork (), morate uključiti sljedeće datoteke zaglavlja:



#uključi
#uključi
#uključi

Prilikom rada s vilicom (), može se koristiti za vrstu pid_t za ID procesa kao što je pid_t definiran u.

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

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

Sintaksa vilice ()

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

pid_t vilica (void);

U sintaksi je tip povratka pid_t . Kad se podređeni proces uspješno kreira, PID podređenog procesa vraća se u roditeljski proces, a 0 će se vratiti u sam podređeni proces.

Ako postoji bilo kakva pogreška, -1 se vraća roditeljskom procesu, a podređeni proces se ne stvara.

No arguments are passed to fork(). 

Primjer 1: Vilica ()

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

KODIRATI:

#uključi
#uključi
#uključi

intglavni()
{
vilica();
printf ('Korištenje sistemskog poziva fork () n');
povratak 0;
}

IZLAZ:

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

U ovom smo programu koristili fork (), to će stvoriti novi podređeni proces. Kad se stvori podređeni proces, i roditeljski i podređeni proces pokazat će na sljedeću instrukciju (isti programski brojač). Na taj će se način preostale upute ili C naredbe izvršiti ukupan broj procesa, to jest 2nputa, gdje je n broj sistemskih poziva fork ().

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

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

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

KODIRATI:

#uključi
#uključi
#uključi

intglavni()
{
vilica();
vilica();
vilica();
vilica();
printf ('Korištenje fork () sistemskog poziva');
povratak 0;
}

Izlaz:

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 

Sada je ukupan broj stvorenih procesa 24= 16 i imamo ispis ispisa izveden 16 puta.

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

U sljedećem primjeru koristili smo konstrukciju donošenja odluka za testiranje vrijednosti (int) koju vraća fork (). Prikazuju se i odgovarajuće poruke:

KODIRATI:

#uključi
#uključi
#uključi

intglavni()
{
pid_t str;
str=vilica();
ako(str== -1)
{
printf ('Došlo je do pogreške pri pozivanju fork ()');
}
ako(str==0)
{
printf ('Mi smo u procesu djeteta');
}
drugo
{
printf ('U roditeljskom smo procesu');
}
povratak 0;
}

IZLAZ:

U roditeljskom smo procesu
Mi smo u procesu djeteta

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

str=vilica();

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

Kada se koristi poziv fork () i dijete se uspješno kreira, ID podređenog procesa bit će vraćen roditeljskom procesu, a 0 će se vratiti podređenom procesu. ID podređenog procesa u roditeljskom procesu neće biti isti kao ID podređenog procesa u samom procesu djeteta. U podređenom procesu ID podređenog procesa bit će 0.

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