Villarendszer hívása C -ben

Fork System Call C



A fork () rendszerhívás egy gyermekprogram létrehozására szolgál 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 . Egy olyan programban, ahol villát használ, a wait () rendszerhívást is használnia kell. wait () rendszerhívás arra szolgál, hogy megvárjuk a szülői folyamatban, amíg a gyermek folyamat befejeződik. A gyermekfolyamat befejezéséhez az exit () rendszerhívást használják a gyermekfolyamatban. A wait () függvény a fejlécben van definiálva sys/várj.h és az exit () függvény a fejlécben van definiálva stdlib.h .

1. ábra: Alapvilla () munkafolyamat

1. ábra: Alapvilla () munkafolyamat







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



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

A fork () rendszerfüggvény szintaxisa a következő:



pid_t villa(üres);

A fork () rendszerfüggvény semmilyen érvet nem fogad el. A típus egész számát adja vissza pid_t .





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

Egyszerű villa () Példa:

Az alábbiakban egy egyszerű villa () példát mutatunk be:



#befoglalni
#befoglalni
#befoglalni
#befoglalni
#befoglalni

intfő-(üres) {
pid_t pid=Villa();

ha(pid== 0) {
printf ('Gyermek => PPID: %d PID: %d n',kapaszkodó(),hülye());
kijárat (EXIT_SUCCESS);
}
más ha(pid> 0) {
printf ('Szülő => PID: %d n',hülye());
printf („Várom a gyermeki folyamat befejezését. n');
várjon(NULLA);
printf (- A gyermekfolyamat befejeződött. n');
}
más {
printf ('Nem sikerült létrehozni a gyermekfolyamatot. n');
}

VisszatérésEXIT_SUCCESS;
}

Itt a fork () segítségével létrehoztam egy gyermekfolyamatot a fő/szülő folyamatból. Ezután kinyomtattam a PID -t (folyamatazonosítót) és a PPID -t (szülői folyamat -azonosítót) a gyermek és a szülő folyamatából. A szülői folyamaton a várakozás (NULL) arra szolgál, hogy megvárja a gyermekfolyamat befejezését. A gyermekfolyamaton az exit () a gyermekfolyamat befejezésére szolgál. Amint láthatja, a szülői folyamat PID -je a gyermekfolyamat PPID -je. Tehát a gyermek folyamat 24738 a szülői folyamathoz tartozik 24731 .

Funkciókkal modulárisabbá teheti a programot. Itt használtam processTask () és parentTask () funkciók a gyermek és a szülői folyamatokhoz. A fork () -ot valójában így használják.

#befoglalni
#befoglalni
#befoglalni
#befoglalni
#befoglalni

üreschildTask() {
printf ('Helló Világ n');
}

üresparentTask() {
printf ('Fő feladat. n');
}

intfő-(üres) {
pid_t pid=Villa();

ha(pid== 0) {
childTask();
kijárat (EXIT_SUCCESS);
}
más ha(pid> 0) {
várjon(NULLA);
parentTask();
}
más {
printf ('Nem sikerült létrehozni a gyermekfolyamatot.');
}

VisszatérésEXIT_SUCCESS;
}

A fenti program kimenete:

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

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

#befoglalni
#befoglalni
#befoglalni
#befoglalni
#befoglalni

intfő-(üres) {
számára(intén= 1;én<= 5;én++) {
pid_t pid=Villa();

ha(pid== 0) {
printf ('Gyermekfolyamat => PPID =%d, PID =%d n',kapaszkodó(),hülye());
kijárat (0);
}
más {
printf ('Szülői folyamat => PID =%d n',hülye());
printf ('Várjuk a gyermekfolyamatok befejezését ... n');
várjon(NULLA);
printf ('a gyermekfolyamat befejeződött. n');
}
}

VisszatérésEXIT_SUCCESS;
}

Mint látható, a szülői folyamat azonosítója minden gyermekfolyamatban azonos. Tehát mindegyik ugyanahhoz a szülőhöz tartozik. Ezeket lineáris módon is végrehajtják. 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 bármikor szabályozhatja ezen folyamatok áramlását.

Példa a valós életre:

Különféle bonyolult matematikai számítások, például md5, sha256 stb. Ahelyett, hogy a fő programmal azonos folyamatban számítana ilyesmit, egyszerűen kiszámíthatja a hash -t egy gyermekfolyamaton, és visszaadhatja a hash -t a fő folyamatnak.

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

#befoglalni
#befoglalni
#befoglalni
#befoglalni
#befoglalni

intgetPIN() {
// használjon PPID -t és PID -t magként
srand (hülye() +kapaszkodó());
inttitok= 1000 + sor () % 9000;
Visszatéréstitok;
}

intfő-(üres) {
intfd[2];
pipa(fd);
pid_t pid=Villa();

ha(pid> 0) {
Bezárás(0);
Bezárás(fd[1]);
után(fd[0]);

inttitkos szám;
size_treadBytes=olvas(fd[0], &titkos szám, mérete(titkos szám));

printf ('PIN -kódra várva ... n');
várjon(NULLA);
printf ('Bájtok: %ld n',readBytes);
printf ('PIN: %d n',titkos szám);
}
más ha(pid== 0) {
Bezárás(1);
Bezárás(fd[0]);
után(fd[1]);

inttitok=getPIN();
ír(fd[1], &titok, mérete(titok));
kijárat (EXIT_SUCCESS);
}

VisszatérésEXIT_SUCCESS;
}

Amint látja, minden alkalommal, amikor futtatom a programot, egy másik 4 számjegyű PIN-kódot kapok.

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