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:
- A gyermekfolyamat folyamatazonosítója egyedi folyamatazonosító, amely különbözik az összes többi folyamat azonosítójától.
- 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:
- A CPU számlálókat és az erőforrás-felhasználásokat inicializálják, hogy nullára álljanak.
- 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.
- 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.
- 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.
- 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.
- Hasonlóan a nyitott könyvtárfolyamokat is öröklik a gyermekfolyamatok.
- 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:
- Memóriazárak
- A gyermekosztály függőben lévő jele üres.
- A társított rekordzárak feldolgozása (fcntl ())
- Aszinkron I / O műveletek és I / O tartalmak.
- Könyvtárváltási értesítések.
- 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 (),
A fejlécfájl
A visszatérés típusát a
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álataA 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 vagyunkA 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.