Rendszerhívások

Fork System Hívja a Linuxot

Fork System Hívja a Linuxot

Villa rendszerhívás

A villarendszer-hívást új folyamatok létrehozására használják. Az újonnan létrehozott folyamat a gyermekfolyamat. Az a folyamat, amely villát hív és új folyamatot hoz létre, a szülő folyamat. A gyermek és a szülő folyamatát egyidejűleg hajtják végre.

De a gyermek és a szülő folyamatai különböző memóriatereken helyezkednek el. Ezeknek a memóriatereknek ugyanaz a tartalmuk, és bármi műveletet hajt végre egy folyamat, az nem befolyásolja a másik folyamatot.

Amikor a gyermek folyamatai létrejönnek; most mindkét folyamatnak ugyanaz a programszámlálója (PC) lesz, tehát mindkét folyamat ugyanarra a következő utasításra mutat. A szülői folyamat által megnyitott fájlok megegyeznek a gyermekfolyamatokkal.

A gyermek folyamat pontosan megegyezik a szülőjével, de különbség van a folyamat azonosítóiban:

  1. A gyermekfolyamat folyamatazonosítója egyedi folyamatazonosító, amely különbözik az összes többi folyamat azonosítójától.
  2. A szülői folyamat azonosítója megegyezik a gyermek szülőjének azonosítójával.

A gyermek folyamat tulajdonságai

Az alábbiakban bemutatjuk azokat a tulajdonságokat, amelyekkel a gyermekfolyamat rendelkezik:

  1. A CPU számlálókat és az erőforrás-felhasználásokat inicializálják, hogy nullára álljanak.
  2. Amikor a szülő folyamat leáll, az alárendelt folyamatok nem kapnak jelet, mert az prctl () -ben lévő PR_SET_PDEATHSIG attribútum visszaáll.
  3. A fork () hívásához használt szál létrehozza a gyermek folyamatát. Tehát a gyermek folyamatának címe megegyezik a szülőével.
  4. A szülő folyamat fájlleíróját a gyermek folyamat örökli. Például a fájl eltolása vagy a zászlók állapota és az I / O attribútumok meg lesznek osztva a gyermek és a szülő folyamatok fájlleírói között. Tehát a szülő osztály fájlleírója a gyermek osztály azonos fájlleírójára hivatkozik.
  5. A szülői folyamat nyitott üzenetsor-leíróit a gyermekfolyamat örökli. Például, ha egy fájlleíró tartalmaz üzenetet a szülő folyamatban, ugyanaz az üzenet lesz a gyermek folyamat megfelelő fájlleírójában. Tehát azt mondhatjuk, hogy ezeknek a fájlleíróknak a flag értékei megegyeznek.
  6. Hasonlóan a nyitott könyvtárfolyamokat is öröklik a gyermekfolyamatok.
  7. A gyermekosztály alapértelmezett időzítői laza értéke megegyezik a szülőosztály aktuális időzítői laza értékével.

Tulajdonságok, amelyeket a Gyermek folyamat nem örökít

Az alábbiakban felsorolunk néhány olyan tulajdonságot, amelyet nem örökít a gyermekfolyamat:

  1. Memóriazárak
  2. A gyermekosztály függőben lévő jele üres.
  3. A társított rekordzárak feldolgozása (fcntl ())
  4. Aszinkron I / O műveletek és I / O tartalmak.
  5. Könyvtárváltási értesítések.
  6. Az olyan időzítőket, mint a riasztás (), a setitimer (), a gyermekosztály nem örökli.

villa () a C-ben

A fork () -ben nincsenek argumentumok, és a fork () visszatérési típusa egész szám. A fork () használatakor a következő fejlécfájlokat kell tartalmaznia:

#include
#include
#include

Villával való munkavégzéskor (), típushoz használható pid_t a folyamatok azonosítóihoz, mint a pid_t, a .

A fejlécfájl ahol a fork () definiálva van, ezért be kell illesztenie a programba a fork () használatához.

A visszatérés típusát a és a fork () hívást a . Ezért a fork () rendszerhívás használatához mindkét programot be kell vonni.

A villa szintaxisa ()

A fork () rendszerhívás szintaxisa a Linuxban, az Ubuntu a következő:

pid_t villa (érvénytelen);

A szintaxisban a visszatérés típusa pid_t. A gyermekfolyamat sikeres létrehozása után a gyermekfolyamat PID-je visszakerül a szülői folyamatba, és 0 visszakerül magába a gyermekfolyamatba.

Ha bármilyen hiba van, akkor -1 visszatér a szülői folyamatba, és a gyermek folyamat nem jön létre.

Nem adunk át argumentumokat a fork () számára. 

1. példa: Hívóvilla ()

Tekintsük a következő példát, amelyben a fork () rendszerhívást használtuk egy új gyermekfolyamat létrehozásához:

KÓD:

#include
#include
#include
int main ()

Villa();
printf ("A fork () rendszerhívás használata \ n");
visszatér 0;

KIMENET:

A fork () rendszerhívás használata
A fork () rendszerhívás használata

Ebben a programban a fork () -t használtuk, ez új gyermekfolyamatot hoz létre. A gyermekfolyamat létrehozásakor a szülői folyamat és a gyermekfolyamat is a következő utasításra mutat (ugyanaz a programszámláló). Ily módon a fennmaradó utasítások vagy C utasítások végrehajtásra kerülnek a teljes folyamatidők száma, azaz 2n alkalommal, ahol n a fork () rendszerhívások száma.

Tehát, ha a fork () hívást egyszer használjuk a fentiek szerint (21 = 2) a kimenetünk kétszer lesz.

Itt, amikor a fork () rendszerhívást használják, a belső szerkezet a következőképpen fog kinézni:

Vegye figyelembe a következő esetet, amikor a villát () négyszer használják:

KÓD:

#include
#include
#include
int main ()

Villa();
Villa();
Villa();
Villa();
printf ("Fork () rendszerhívás használata");
visszatér 0;

Kimenet:

Villa () rendszerhívás használata villa () rendszerhívás használata villa () rendszerhívás használata villa () rendszerhívás használata villa () használata villa () rendszerhívás használata villa () rendszerhívás használata villa () rendszerhívás használata villa () rendszervilla villahasználata () rendszerhívás villával () rendszerhívás villával () rendszerhívás villával () rendszerhívás villával () rendszerhívás használatával villával () rendszerhívás villával () villa hívásával 

Most a létrehozott folyamat teljes száma 24 = 16 és a nyomtatott utasításunkat 16 alkalommal hajtjuk végre.

2. példa: A villa () sikeres tesztelése

A következő példában a döntéshozó konstrukciót használtuk a villa () által visszaadott (int) érték tesztelésére. És megjelennek a megfelelő üzenetek:

KÓD:

#include
#include
#include
int main ()

pid_t p;
p = villa ();
ha (p == - 1)

printf ("Hiba történt a fork () meghívása közben");

ha (p == 0)

printf ("A gyermek folyamatában vagyunk");

más

printf ("A szülő folyamatban vagyunk");

visszatér 0;

KIMENET:

A szülői folyamatban vagyunk
A gyermek folyamatában vagyunk

A fenti példában a pid_t típust használtuk, amely a fork () visszatérési értékét tárolja. a villát () hívják online:

p = villa ();

Tehát a fork () által visszaadott egész értéket p-ben tároljuk, majd p-t összehasonlítva ellenőrizzük, hogy a fork () hívásunk sikeres volt-e.

Amikor a fork () hívást használjuk, és a gyermek sikeresen létrehozásra kerül, a gyermek folyamat azonosítója visszatér a szülői folyamathoz, és 0 visszatér a gyermek folyamathoz.A szülői folyamatban lévő gyermekfolyamat azonosítója nem egyezik meg a gyermekfolyamat azonosítójával magában a gyermekfolyamatban. A gyermek folyamatban a gyermek folyamat azonosítója 0 lesz.

Ezzel a bemutatóval láthatja, hogyan kezdje el a Linux rendszeren végzett villahívás kezdeményezését.

A GameConqueror Cheat Engine használata Linux alatt
A cikk tartalmaz egy útmutatót a GameConqueror csaló motor Linux alatt történő használatáról. Sok olyan felhasználó, aki Windows-on játszik játékot, g...
A legjobb játékkonzol emulátorok Linuxhoz
Ez a cikk felsorolja a Linux számára elérhető népszerű játékkonzol-emulációs szoftvereket. Az emuláció egy szoftver-kompatibilitási réteg, amely játék...
A legjobb Linux-disztribútorok játékhoz 2021-ben
A Linux operációs rendszer hosszú utat tett meg eredeti, egyszerű, szerver alapú kinézetétől. Ez az operációs rendszer rendkívül javult az elmúlt évek...