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.