Kahvlisüsteemi kõne C -s

Fork System Call C

fork () süsteemikõnet kasutatakse C -programmis alamprotsesside loomiseks. kahvlit () kasutatakse seal, kus teie rakenduses on vaja paralleelset töötlemist. Kahvel () süsteemi funktsioon on määratletud päistes sys/tüübid.h ja unistd.h . Programmis, kus kasutate kahvlit, peate kasutama ka süsteemikõnet wait (). wait () süsteemikõne abil oodatakse vanemprotsessis, kuni alamprotsess lõpeb. Alamprotsessi lõpetamiseks kasutatakse alamprotsessis süsteemikõnet exit (). Funktsioon wait () on määratletud päises sys/oota.h ja funktsioon exit () on määratletud päises stdlib.h .

Joonis 1: kahvli () põhitöövoog

Joonis 1: kahvli () põhitöövoog



Selles artiklis näitan teile, kuidas kasutada fork () süsteemikõnet, et luua C -s alamprotsesse. Niisiis, alustame.



fork () Süntaks ja tagastusväärtus:

Funktsiooni kahvli () süntaks on järgmine:



pid_t kahvel(tühine);

Süsteemi funktsioon fork () ei aktsepteeri ühtegi argumenti. Tagastab seda tüüpi täisarvu pid_t .

Edu korral tagastab kahvel () alamprotsessi PID -i, mis on suurem kui 0. Alamprotsessi tagastamisväärtus on 0. Kui kahvel () ebaõnnestub, tagastab see -1.

Lihtne kahvel () Näide:

Allpool on toodud lihtne kahvli () näide:



#kaasake
#kaasake
#kaasake
#kaasake
#kaasake

intpeamine(tühine) {
pid_t pid=kahvel();

kui(pid== 0) {
printf ('Laps => PPID: %d PID: %d n',äge(),loll());
väljumine (EXIT_SUCCESS);
}
muidu kui(pid> 0) {
printf ('Vanem => PID: %d n',loll());
printf ('Ootan lapse protsessi lõpuleviimist. n');
oota(NULL);
printf ('Lapseprotsess on lõppenud. n');
}
muidu {
printf („Alamprotsessi ei saa luua. n');
}

tagasiEXIT_SUCCESS;
}

Siin kasutasin kahvlit (), et luua põhi-/vanemprotsessist alamprotsess. Seejärel printisin PID (protsessi ID) ja PPID (vanemprotsessi ID) alam- ja vanemprotsessist. Vanemprotsessis ootamist (NULL) kasutatakse alamprotsessi lõppemise ootamiseks. Alamprotsessis kasutatakse alamprotsessi lõpetamiseks exit (). Nagu näete, on vanemprotsessi PID alamprotsessi PPID. Niisiis, lapse protsess 24738 kuulub vanemprotsessi 24731 .

Funktsioone saate kasutada ka oma programmi modulaarsemaks muutmiseks. Siin ma kasutasin processTask () ja parentTask () funktsioone vastavalt lapse ja vanema protsessidele. Nii kasutatakse tegelikult kahvlit ().

#kaasake
#kaasake
#kaasake
#kaasake
#kaasake

tühinelapsülesanne() {
printf ('Tere, Maailm n');
}

tühineparentTask() {
printf ('Peamine ülesanne. n');
}

intpeamine(tühine) {
pid_t pid=kahvel();

kui(pid== 0) {
lapsülesanne();
väljumine (EXIT_SUCCESS);
}
muidu kui(pid> 0) {
oota(NULL);
parentTask();
}
muidu {
printf ('Alamprotsessi ei saa luua.');
}

tagasiEXIT_SUCCESS;
}

Ülaltoodud programmi väljund:

Mitme lapsprotsessi käivitamine kahvli () ja silmuse abil:

Lingi abil saate luua ka nii palju alamprotsesse kui vaja. Allolevas näites olen loonud loopi jaoks 5 alamprotsessi. Trükkisin ka PID ja PPID alamprotsessidest.

#kaasake
#kaasake
#kaasake
#kaasake
#kaasake

intpeamine(tühine) {
eest(inti= 1;i<= 5;i++) {
pid_t pid=kahvel();

kui(pid== 0) {
printf ('Alamprotsess => PPID =%d, PID =%d n',äge(),loll());
väljumine (0);
}
muidu {
printf ('Vanemprotsess => PID =%d n',loll());
printf ('Ootan, kuni lapsprotsessid lõpevad ... n');
oota(NULL);
printf ('lapsprotsess lõppes. n');
}
}

tagasiEXIT_SUCCESS;
}

Nagu näete, on vanemprotsessi ID kõigis alamprotsessides sama. Niisiis, kõik nad kuuluvad samale vanemale. Nad täidavad ka lineaarselt. Üksteise järel. Lapseprotsesside juhtimine on keerukas ülesanne. Kui õpite lisateavet Linuxi süsteemide programmeerimise ja selle toimimise kohta, saate nende protsesside voogu igal juhul kontrollida.

Tegeliku elu näide:

Erinevad keerulised matemaatilised arvutused, nagu md5, sha256 jne, räsimoodustus nõuavad palju töötlemisvõimsust. Selle asemel, et arvutada selliseid asju põhiprogrammiga samas protsessis, saate lihtsalt arvutada alamprotsessi räsi ja naasta räsipõhiprotsessile.

Järgmises näites olen loonud alamprotsessis neljakohalise PIN-koodi ja saatnud selle põhiprogrammi vanemprotsessile. Seejärel printisin sealt PIN -koodi.

#kaasake
#kaasake
#kaasake
#kaasake
#kaasake

intgetPIN() {
// kasutage seemneks PPID ja PID
srand (loll() +äge());
intsaladus= 1000 + rida () % 9000;
tagasisaladus;
}

intpeamine(tühine) {
intfd[2];
toru(fd);
pid_t pid=kahvel();

kui(pid> 0) {
Sulge(0);
Sulge(fd[1]);
pärast(fd[0]);

intsalajane number;
suurus_treadBytes=loe(fd[0], &salajane number, suurus(salajane number));

printf ('PIN -koodi ootamine ... n');
oota(NULL);
printf ('Baiti loetud: %ld n',readBytes);
printf ('PIN -kood: %d n',salajane number);
}
muidu kui(pid== 0) {
Sulge(1);
Sulge(fd[0]);
pärast(fd[1]);

intsaladus=getPIN();
kirjutada(fd[1], &saladus, suurus(saladus));
väljumine (EXIT_SUCCESS);
}

tagasiEXIT_SUCCESS;
}

Nagu näete, saan iga kord programmi käivitades erineva 4-kohalise PIN-koodi.

Niisiis, põhimõtteliselt kasutate Linuxis kahvli () süsteemikõnet. Täname, et lugesite seda artiklit.