Systém vidlíc Linux

Fork System Call Linux



Systémové volanie vidlice sa používa na vytvorenie nových procesov. Novovytvorený proces je detský proces. Proces, ktorý volá fork a vytvára nový proces, je nadradený proces. Podradený a nadradený proces sa vykonáva súčasne.

Procesy dieťaťa a rodiča sa však nachádzajú v rôznych pamäťových priestoroch. Tieto pamäťové priestory majú rovnaký obsah a akákoľvek operácia vykonaná jedným procesom neovplyvní druhý proces.







Keď je vytvorený detský proces; teraz budú mať oba procesy rovnaký programový čítač (PC), takže oba tieto procesy budú smerovať k tej istej ďalšej inštrukcii. Súbory otvorené rodičovským procesom budú rovnaké pre podradený proces.



Podradený proces je úplne rovnaký ako jeho nadradený, ale v ID procesoch sú rozdiely:



  1. ID procesu podradeného procesu je jedinečný identifikátor procesu, ktorý sa líši od ID všetkých ostatných existujúcich procesov.
  2. ID rodičovského procesu bude rovnaké ako ID procesu rodiča dieťaťa.

Vlastnosti detského procesu

Nasledujú niektoré z vlastností, ktoré má podradený proces:





  1. Počítadlá CPU a využitie zdrojov sa inicializujú, aby sa vynulovali.
  2. Keď je nadradený proces ukončený, podradené procesy nedostanú žiadny signál, pretože atribút PR_SET_PDEATHSIG v prctl () je resetovaný.
  3. Vlákno používané na volanie fork () vytvára podradený proces. Adresa procesu dieťaťa bude teda rovnaká ako adresa rodiča.
  4. Popisovač súboru nadradeného procesu je zdedený podradeným procesom. Posun súboru alebo stav vlajok a atribúty I/O budú napríklad zdieľané medzi deskriptormi súborov podradených a nadradených procesov. Deskriptor súboru nadradenej triedy bude teda odkazovať na rovnaký popisovač súborov podradenej triedy.
  5. Otvorené deskriptory frontu správ nadradeného procesu sú zdedené podradeným procesom. Napríklad, ak deskriptor súboru obsahuje správu v rodičovskom procese, rovnaká správa bude prítomná v zodpovedajúcom deskriptore súboru podradeného procesu. Môžeme teda povedať, že hodnoty vlajok týchto deskriptorov súborov sú rovnaké.
  6. Podobne otvorené toky adresárov budú zdedené podradenými procesmi.
  7. Predvolená hodnota vôle časovača podradenej triedy je rovnaká ako aktuálna hodnota vôle časovača rodičovskej triedy.

Vlastnosti, ktoré nie sú zdedené podradeným procesom

Nasledujú niektoré z vlastností, ktoré nie sú zdedené podradeným procesom:

  1. Pamäťové zámky
  2. Čakajúci signál detskej triedy je prázdny.
  3. Procesy súvisiace so záznamovými zámkami (fcntl ())
  4. Asynchrónne I/O operácie a obsah I/O.
  5. Upozornenia na zmenu adresára.
  6. Časovače ako alarm (), setitimer () nie sú zdedené podriadenou triedou.

vidlica () v C

V fork () nie sú žiadne argumenty a návratový typ fork () je celé číslo. Keď sa používa fork (), musíte zahrnúť nasledujúce hlavičkové súbory:



#zahrnúť
#zahrnúť
#zahrnúť

Pri práci s vidličkou () môže byť použitý pre typ pid_t pre ID procesov ako je pid_t definovaný v.

V hlavičkovom súbore je definovaný fork (), takže ho musíte zahrnúť do programu, aby ste mohli používať fork ().

Typ návratu je definovaný v a volanie fork () je definované v. Preto musíte do svojho programu zahrnúť obe, aby ste mohli používať systémové volanie fork ().

Syntax vidlice ()

Syntax systémového volania fork () v systéme Linux a Ubuntu je nasledovná:

pid_t fork (neplatné);

V syntaxi je návratový typ pid_t . Keď je podriadený proces úspešne vytvorený, PID podradeného procesu sa vráti v nadradenom procese a 0 sa vráti do samotného podradeného procesu.

Ak dôjde k akejkoľvek chybe, potom sa -1 vráti do nadradeného procesu a podriadený proces sa nevytvorí.

No arguments are passed to fork(). 

Príklad 1: Telefonát ()

Zoberme si nasledujúci príklad, v ktorom sme použili systémové volanie fork () na vytvorenie nového podradeného procesu:

KÓD:

#zahrnúť
#zahrnúť
#zahrnúť

intHlavná()
{
vidlička();
printf ('Použitie systémového hovoru fork () n');
vrátiť sa 0;
}

VÝKON:

Použitie systémového hovoru fork ()
Použitie systémového hovoru fork ()

V tomto programe sme použili fork (), čím sa vytvorí nový podradený proces. Keď je vytvorený podriadený proces, rodičovský aj podradený proces budú smerovať k ďalšej inštrukcii (rovnaké počítadlo programov). Týmto spôsobom sa vykonajú zostávajúce pokyny alebo príkazy C z celkového počtu časov procesu, tj 2nkrát, kde n je počet systémových hovorov fork ().

Keď sa teda hovor fork () použije raz, ako je uvedené vyššie (21= 2) budeme mať náš výstup 2 krát.

Tu, keď sa použije systémové volanie fork (), bude vnútorná štruktúra vyzerať takto:

Zoberme si nasledujúci prípad, v ktorom sa vidlica () používa štyrikrát:

KÓD:

#zahrnúť
#zahrnúť
#zahrnúť

intHlavná()
{
vidlička();
vidlička();
vidlička();
vidlička();
printf („Použitie systémového volania fork ()“);
vrátiť sa 0;
}

Výkon:

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 

Celkový počet vytvorených procesov je 24= 16 a náš tlačový výpis sme vykonali 16 -krát.

Príklad 2: Testovanie, či bol fork () úspešný

V nasledujúcom príklade sme použili rozhodovaciu konštrukciu na testovanie hodnoty (int) vrátenej pomocou fork (). A zobrazia sa zodpovedajúce správy:

KÓD:

#zahrnúť
#zahrnúť
#zahrnúť

intHlavná()
{
pid_t p;
p=vidlička();
keby(p== -1)
{
printf („Pri volaní fork () sa vyskytla chyba);
}
keby(p==0)
{
printf („Sme v procese dieťaťa“);
}
inak
{
printf („Sme v rodičovskom procese“);
}
vrátiť sa 0;
}

VÝKON:

Sme v rodičovskom procese
Sme v procese dieťaťa

Vo vyššie uvedenom príklade sme použili typ pid_t, ktorý uloží návratovú hodnotu fork (). fork () sa volá online:

p=vidlička();

Celočíselná hodnota vrátená fork () je uložená v p a potom p je porovnaná, aby sa skontrolovalo, či naše volanie fork () bolo úspešné.

Keď sa použije volanie fork () a dieťa sa úspešne vytvorí, ID podradeného procesu sa vráti do nadradeného procesu a 0 sa vráti do podradeného procesu. ID podradeného procesu v rodičovskom procese nebude rovnaké ako ID detského procesu v samotnom detskom procese. V detskom procese bude ID podradeného procesu 0.

Tento tutoriál vám ukáže, ako začať so systémovým hovorom fork v linuxe.