C programozás

Villa rendszerhívás C-ben

Villa rendszerhívás C-ben
A fork () rendszerhívást a gyermekprogramok létrehozására használják egy C programban. A fork () akkor használható, ha párhuzamos feldolgozásra van szükség az alkalmazásban. A fork () rendszerfunkciót a fejlécek határozzák meg sys / típusok.h és unistd.h. Abban a programban, ahol villát használ, a wait () rendszerhívást is használnia kell. A wait () rendszerhívás arra szolgál, hogy a szülői folyamatban megvárja a gyermek folyamatának befejezését. A gyermek folyamat befejezéséhez az exit () rendszerhívást használják a gyermek folyamatban. A wait () függvény a fejlécben van meghatározva sys / wait.h és az exit () függvény a fejlécben van meghatározva stdlib.h.

1. ábra: Alapvilla () munkafolyamat

Ebben a cikkben bemutatom, hogyan használhatja a fork () rendszerhívást gyermekfolyamatok létrehozására C-ben. Tehát kezdjük.

fork () Szintaxis és visszatérési érték:

A fork () rendszerfunkció szintaxisa a következő:

pid_t villa (érvénytelen);

A fork () rendszerfüggvény nem fogad el egyetlen argumentumot sem. Egy típusú egész számot ad vissza pid_t.

Siker esetén a fork () visszaadja a gyermek folyamat PID-jét, amely nagyobb, mint 0. A gyermekfolyamaton belül a visszatérési érték 0. Ha a villa () nem sikerül, akkor -1-et ad vissza.

Egyszerű villa () Példa:

Az alábbiakban egy egyszerű villa () példát adunk meg:

#include
#include
#include
#include
#include
 
int main (érvénytelen)
pid_t pid = villa ();
 
if (pid == 0)
printf ("Gyerek => PPID:% d PID:% d \ n", getppid (), getpid ());
kilépés (EXIT_SUCCESS);

else if (pid> 0)
printf ("Szülő => PID:% d \ n", getpid ());
printf ("Várakozás a gyermek folyamatának befejezésére.\ n ");
várakozás (NULL);
printf ("A gyermek folyamat befejeződött.\ n ");

más
printf ("Nem lehet létrehozni a gyermek folyamatot.\ n ");

 
visszatér EXIT_SUCCESS;

Itt a fork () segítségével létrehoztam egy gyermek folyamatot a fő / szülő folyamatból. Ezután kinyomtattam a PID (folyamatazonosító) és a PPID (szülői folyamatazonosító) gyermek és szülő folyamatból. A szülői folyamatban a várakozás (NULL) arra szolgál, hogy megvárja a gyermek folyamatának befejezését. A gyermek folyamatban az exit () paranccsal fejezzük be a gyermek folyamatát. Mint látható, a szülő folyamat PID-je a gyermek folyamat PPID-je. Tehát, a gyermek folyamata 24738 a szülői folyamathoz tartozik 24731.

Funkciókat is használhat a program modulárisabbá tételéhez. Itt használtam processTask () és parentTask () funkciók a gyermek és a szülő folyamatai számára. Így használják a fork () -t valójában.

#include
#include
#include
#include
#include
 
void childTask ()
printf ("Hello World \ n");

 
void parentTask ()
printf ("Fő feladat.\ n ");

 
int main (érvénytelen)
pid_t pid = villa ();
 
if (pid == 0)
childTask ();
kilépés (EXIT_SUCCESS);

else if (pid> 0)
várakozás (NULL);
parentTask ();

más
printf ("Nem lehet létrehozni a gyermek folyamatot.");

 
visszatér EXIT_SUCCESS;

A fenti program kimenete:

Több gyermekfolyamat futtatása a villa () és a hurok használatával:

A ciklus segítségével annyi gyermekfolyamatot is létrehozhat, amennyire szüksége van. Az alábbi példában 5 gyermek folyamatot hoztam létre a loop használatával. Ki is nyomtattam a gyermek folyamatok PID-jét és PPID-jét.

#include
#include
#include
#include
#include
 
int main (érvénytelen)
mert (int i = 1; i <= 5; i++)
pid_t pid = villa ();
 
if (pid == 0)
printf ("Gyermekfolyamat => PPID =% d, PID =% d \ n", getppid (), getpid ());
kilépés (0);

más
printf ("Szülői folyamat => PID =% d \ n", getpid ());
printf ("Várakozás a gyermekfolyamatok befejezésére ... \ n");
várakozás (NULL);
printf ("gyermek folyamat befejeződött.\ n ");


 
visszatér EXIT_SUCCESS;

Amint láthatja, a szülői folyamat azonosítója minden gyermekfolyamatban megegyezik. Tehát mindegyik ugyanahhoz a szülőhöz tartozik. Lineáris módon hajtanak végre. Egyik a másik után. A gyermekfolyamatok ellenőrzése kifinomult feladat. Ha többet megtud a Linux rendszer programozásáról és működéséről, akkor úgy is tudja irányítani ezeknek a folyamatoknak a menetét, amilyennek tetszik.

Példa a való életre:

Különböző komplex matematikai számítások, mint például az md5, sha256 stb. Hash generálása sok feldolgozási teljesítményt igényel. Ahelyett, hogy az ilyen dolgokat kiszámolná ugyanabban a folyamatban, mint a fő program, egyszerűen kiszámíthatja a hash-t egy gyermek folyamatban, és visszaadhatja a hash-t a fő folyamatnak.

A következő példában létrehoztam egy négyjegyű PIN-kódot egy gyermekfolyamatban, és elküldtem a szülői folyamatnak, a főprogramnak. Aztán onnan kinyomtattam a PIN kódot.

#include
#include
#include
#include
#include
 
int getPIN ()
// használd magként a PPID-t és a PID-t
srand (getpid () + getppid ());
int titkos = 1000 + rand ()% 9000;
visszatérési titok;

 
int main (érvénytelen)
int fd [2];
cső (fd);
pid_t pid = villa ();
 
if (pid> 0)
bezár (0);
bezár (fd [1]);
dup (fd [0]);
 
int secretNumber;
size_t readBytes = read (fd [0], & secretNumber, sizeof (secretNumber));
 
printf ("Várakozás PIN-kódra ... \ n");
várakozás (NULL);
printf ("olvasott bájtok:% ld \ n", readBytes);
printf ("PIN:% d \ n", secretNumber);

else if (pid == 0)
bezár (1);
bezár (fd [0]);
dup (fd [1]);
 
int titok = getPIN ();
write (fd [1], & titkos, sizeof (titkos));
kilépés (EXIT_SUCCESS);

 
visszatér EXIT_SUCCESS;

Mint láthatja, minden egyes alkalommal, amikor elindítom a programot, más és négyjegyű PIN-kódot kapok.

Tehát alapvetően így használja a fork () rendszerhívást Linux alatt. Köszönjük, hogy elolvasta ezt a cikket.

A legjobb játékok kézi követéssel
Az Oculus Quest nemrégiben bemutatta a vezérlés nélküli kézi követés nagyszerű ötletét. Az egyre növekvő számú játékkal és tevékenységgel, amelyek tám...
Az OSD-fedvény megjelenítése teljes képernyős Linux-alkalmazásokban és játékokban
Teljes képernyős játékok lejátszása vagy alkalmazások figyelemelterelés nélküli, teljes képernyős módban történő használata elvághatja a panelen vagy ...
Az 5 legjobb játékrögzítő kártya
Mindannyian láttuk és szerettük a YouTube-on a streaming játékokat. A PewDiePie, a Jakesepticye és a Markiplier csak néhány a legnépszerűbb játékosok ...