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.