A villás rendszer hívja a Linuxot

Fork System Call Linux



A villás rendszerhívást új folyamatok létrehozására használják. Az újonnan létrehozott folyamat a gyermekfolyamat. A folyamat, amely meghívja a villát és új folyamatot hoz létre, a szülői folyamat. A gyermek és a szülő folyamatok egyidejűleg kerülnek végrehajtásra.

De a gyermek és a szülői folyamatok különböző memóriaterületeken találhatók. Ezek a memóriaterületek azonos tartalommal rendelkeznek, és az egyik folyamat által végrehajtott műveletek nem befolyásolják a másik folyamatot.







Amikor a gyermekfolyamatok létrejönnek; most mindkét folyamat ugyanazzal a programszámlálóval (PC) rendelkezik, így mindkét folyamat ugyanahhoz a következő utasításhoz fog mutatni. A szülői folyamat által megnyitott fájlok ugyanazok lesznek a gyermekfolyamatok esetében.



A gyermekfolyamat pontosan ugyanaz, mint a szülője, de a folyamat -azonosítókban vannak különbségek:



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

A gyermekfolyamat tulajdonságai

Az alábbiakban felsorolunk néhány olyan tulajdonságot, amelyet egy gyermekfolyamat tartalmaz:





  1. A CPU számlálók és az erőforrás kihasználtság inicializálva nullázódnak.
  2. Amikor a szülői folyamat befejeződik, a gyermekfolyamatok nem kapnak jelet, mert a pr_1ET_PDEATHSIG attribútum a prctl () -ban visszaáll.
  3. A fork () hívásához használt szál létrehozza a gyermekfolyamatot. Tehát a gyermekfolyamat címe ugyanaz lesz, mint a szülőé.
  4. A szülői folyamat fájlleíróját a gyermekfolyamat örökli. Például a fájl eltolása vagy a zászlók állapota és az I/O attribútumok megosztásra kerülnek a gyermek- és szülőfolyamatok fájlleírói között. Tehát a szülőosztály fájlleírója a gyermekosztály azonos fájlleírójára fog hivatkozni.
  5. A szülői folyamat nyitott üzenetsor -leíróit a gyermekfolyamat örökli. Például, ha egy fájlleíró tartalmaz egy üzenetet a szülő folyamatban, akkor ugyanaz az üzenet lesz jelen a gyermek folyamat megfelelő fájlleírójában. Tehát azt mondhatjuk, hogy ezeknek a fájlleíróknak a jelző értékei azonosak.
  6. Hasonló módon a nyitott könyvtárfolyamokat örökölni fogják a gyermekfolyamatok.
  7. A gyermekosztály alapértelmezett időzítő lazulási értéke megegyezik a szülőosztály aktuális időzítő lazaság értékével.

Tulajdonságok, amelyeket a gyermek folyamat nem örököl

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

  1. Memória zár
  2. A gyermekosztály függőben lévő jele üres.
  3. A kapcsolódó rekordzárak feldolgozása (fcntl ())
  4. Aszinkron I/O műveletek és I/O tartalom.
  5. A címtárváltásról szóló értesítések.
  6. Az olyan időzítőket, mint a riasztás (), a setitimer (), nem örökli a gyermekosztály.

villa () C -ben

A fork () nem tartalmaz érveket, és a fork () visszatérési típusa egész. A fork () használatakor a következő fejlécfájlokat kell tartalmaznia:



#befoglalni
#befoglalni
#befoglalni

Ha villával () dolgozik, a típushoz használható pid_t a folyamat azonosítókhoz, mint pid_t van definiálva.

A fejlécfájl az, ahol a fork () definiálva van, ezért a fork () használatához be kell vennie a programjába.

A visszatérési típus definiálva van, a fork () hívás pedig itt. Ezért a fork () rendszerhívás használatához mindkettőt be kell vennie a programjába.

A villa szintaxisa ()

A fork () rendszerhívás szintaxisa Linux, Ubuntu esetén a következő:

pid_t villa (void);

A szintaxisban a visszatérési típus az pid_t . Amikor a gyermekfolyamat sikeresen létrejött, a gyermekfolyamat PID -je visszaadódik a szülői folyamatban, és a 0 visszaadódik magának a gyermekfolyamatnak.

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

No arguments are passed to fork(). 

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

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

KÓD:

#befoglalni
#befoglalni
#befoglalni

intfő-()
{
Villa();
printf ('Fork () rendszerhívás használata n');
Visszatérés 0;
}

KIMENET:

Fork () rendszerhívás használata
Fork () rendszerhívás használata

Ebben a programban a fork () -ot használtuk, ez új gyermekfolyamatot hoz létre. A gyermekfolyamat létrehozásakor mind a szülői folyamat, mind a gyermekfolyamat 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 a teljes folyamatidők száma, azaz 2nalkalommal, ahol n a fork () rendszerhívások száma.

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

Itt a fork () rendszerhívás használatakor a belső szerkezet így fog kinézni:

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

KÓD:

#befoglalni
#befoglalni
#befoglalni

intfő-()
{
Villa();
Villa();
Villa();
Villa();
printf ('Fork () rendszerhívás használata');
Visszatérés 0;
}

Kimenet:

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 

Most a létrehozott folyamatok száma összesen 24= 16, és a nyomtatott utasításunkat 16 -szor hajtjuk végre.

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

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

KÓD:

#befoglalni
#befoglalni
#befoglalni

intfő-()
{
pid_t p;
o=Villa();
ha(o== -1)
{
printf ('Hiba történt a (()) hívás közben);
}
ha(o==0)
{
printf ('A gyermek folyamatban vagyunk');
}
más
{
printf („A szülői folyamatban vagyunk”);
}
Visszatérés 0;
}

KIMENET:

A szülői folyamatban vagyunk
A gyermek folyamatban vagyunk

A fenti példában a pid_t típust használtuk, amely a fork () visszatérési értékét tárolja. fork () a következő sorban hívható:

o=Villa();

Tehát a fork () által visszaadott egész érték p -ben tárolódik, majd p -t összehasonlítjuk annak ellenőrzésével, hogy a fork () hívásunk sikeres volt -e.

Ha a fork () hívást használja, és a gyermek sikeresen létrehozásra került, a gyermekfolyamat azonosítója visszatér a szülői folyamathoz, és a 0 visszatér a gyermekfolyamathoz. A gyermekfolyamat azonosítója a szülői folyamatban nem ugyanaz, mint a A gyermekfolyamat azonosítója magában a gyermekfolyamatban. A gyermekfolyamatban a gyermekfolyamat azonosítója 0 lesz.

Ezzel az oktatóanyaggal megtudhatja, hogyan kezdheti el a villás rendszerhívást linuxban.