Haarukkajärjestelmän puhelu C: ssä

Fork System Call C

haarukan () järjestelmäkutsua käytetään luomaan aliprosesseja C -ohjelmassa. haarukkaa () käytetään silloin, kun sovelluksessasi tarvitaan rinnakkaiskäsittelyä. Haarukan () järjestelmätoiminto on määritetty otsikoissa sys/tyypit. h ja tunnistamaton. h . Ohjelmassa, jossa käytät haarukkaa, sinun on käytettävä myös wait () -järjestelmäkutsua. wait () järjestelmäpuhelua käytetään odottamaan vanhemman prosessissa, että aliprosessi päättyy. Lapsiprosessin viimeistelyyn käytetään poistumis- () järjestelmäkutsua aliprosessissa. Odotus () -funktio on määritetty otsikossa sys/odota. h ja exit () -funktio on määritetty otsikossa stdlib.h .



Kuva 1: Haarukan () perus työnkulku

Kuva 1: Haarukan () perus työnkulku



Tässä artikkelissa aion näyttää sinulle, kuinka haarukan () järjestelmäkutsun avulla luodaan lapsiprosesseja C. Joten aloitetaan.



fork () Syntaksi ja palautusarvo:

Haarukan () järjestelmätoiminnon syntaksi on seuraava:

pid_t haarukka(mitätön);

Haarukan () järjestelmätoiminto ei hyväksy argumentteja. Se palauttaa tyypin kokonaisluvun pid_t .



Onnistuessaan haarukka () palauttaa aliprosessin PID -arvon, joka on suurempi kuin 0. Aliprosessin sisällä palautusarvo on 0. Jos haarukka () epäonnistuu, se palauttaa -1.

Yksinkertainen haarukka () Esimerkki:

Alla on esimerkki haarukasta ():

#sisältää
#sisältää
#sisältää
#sisältää
#sisältää

inttärkein(mitätön) {
pid_t pid=haarukka();

jos(pid== 0) {
printf ('Lapsi => PPID: %d PID: %d n'',kiihkeä(),hölmö());
poistua (EXIT_SUCCESS);
}
muu jos(pid> 0) {
printf ('Vanhempi => PID: %d n'',hölmö());
printf ('Odotetaan lapsiprosessin päättymistä. n'');
odota(TYHJÄ);
printf ('Lapsiprosessi päättyi. n'');
}
muu {
printf ('Aliprosessin luominen ei onnistu. n'');
}

palataEXIT_SUCCESS;
}

Tässä käytin haarukkaa () luodakseni aliprosessin pää/vanhempi -prosessista. Sitten tulostin PID (prosessitunnus) ja PPID (vanhemman prosessitunnus) ali- ja vanhempiprosessista. Pääprosessissa odotusta (NULL) käytetään odottamaan aliprosessin päättymistä. Lapsiprosessissa exit () käytetään lopettamaan aliprosessi. Kuten näette, vanhemman prosessin PID on aliprosessin PPID. Lapsen prosessi siis 24738 kuuluu vanhemman prosessiin 24731 .

Voit myös käyttää toimintoja tehdäksesi ohjelmastasi modulaarisemman. Tässä käytin processTask () ja parentTask () toimintoja lapsen ja vanhemman prosesseille. Näin haarukkaa () todella käytetään.

#sisältää
#sisältää
#sisältää
#sisältää
#sisältää

mitätönlapsiTehtävä() {
printf ('Hei maailma n'');
}

mitätönparentTask() {
printf ('Päätehtävä. n'');
}

inttärkein(mitätön) {
pid_t pid=haarukka();

jos(pid== 0) {
lapsiTehtävä();
poistua (EXIT_SUCCESS);
}
muu jos(pid> 0) {
odota(TYHJÄ);
parentTask();
}
muu {
printf ('Aliprosessin luominen ei onnistu.');
}

palataEXIT_SUCCESS;
}

Yllä olevan ohjelman tulos:

Useiden lapsiprosessien suorittaminen haarukalla () ja silmukalla:

Voit myös käyttää silmukkaa luodaksesi niin monta aliprosessia kuin tarvitset. Alla olevassa esimerkissä olen luonut viisi aliprosessia silmukan avulla. Tulostin myös PID- ja PPID -tiedot lapsiprosesseista.

#sisältää
#sisältää
#sisältää
#sisältää
#sisältää

inttärkein(mitätön) {
varten(inti= 1;i<= 5;i++) {
pid_t pid=haarukka();

jos(pid== 0) {
printf ('Lapsiprosessi => PPID =%d, PID =%d n'',kiihkeä(),hölmö());
poistua (0);
}
muu {
printf ('Pääprosessi => PID =%d n'',hölmö());
printf ('Odotetaan lapsiprosessien päättymistä ... n'');
odota(TYHJÄ);
printf ('lapsiprosessi päättynyt. n'');
}
}

palataEXIT_SUCCESS;
}

Kuten huomaat, vanhemman prosessitunnus on sama kaikissa aliprosesseissa. Kaikki siis kuuluvat samalle vanhemmalle. Ne toimivat myös lineaarisesti. Yksi toisensa jälkeen. Lapsiprosessien hallinta on hienostunut tehtävä. Jos opit lisää Linux -järjestelmän ohjelmoinnista ja sen toiminnasta, voit hallita näiden prosessien kulkua haluamallasi tavalla.

Tosielämän esimerkki:

Erilaiset monimutkaiset matemaattiset laskelmat, kuten md5, sha256 jne. Hajautus, vaativat paljon prosessointitehoa. Sen sijaan, että laskisit sellaisia ​​asioita samassa prosessissa kuin pääohjelma, voit vain laskea lapsiprosessin hajautuksen ja palauttaa tiivistelmän pääprosessiin.

Seuraavassa esimerkissä olen luonut nelinumeroisen PIN-koodin aliprosessissa ja lähettänyt sen pääprosessille, pääohjelmalle. Sitten tulostin PIN -koodin sieltä.

#sisältää
#sisältää
#sisältää
#sisältää
#sisältää

intgetPIN() {
// käytä siemeniä PPID: tä ja PID: tä
srand (hölmö() +kiihkeä());
intsalaisuus= 1000 + rivi () % 9000;
palatasalaisuus;
}

inttärkein(mitätön) {
intfd[2];
putki(fd);
pid_t pid=haarukka();

jos(pid> 0) {
kiinni(0);
kiinni(fd[1]);
jälkeen(fd[0]);

intsalainen numero;
koko_treadBytes=lukea(fd[0], &salainen numero, koko(salainen numero));

printf ('Odotetaan PIN -koodia ... n'');
odota(TYHJÄ);
printf ('Tavua luku: %ld n'',readBytes);
printf ('PIN -koodi: %d n'',salainen numero);
}
muu jos(pid== 0) {
kiinni(1);
kiinni(fd[0]);
jälkeen(fd[1]);

intsalaisuus=getPIN();
kirjoittaa(fd[1], &salaisuus, koko(salaisuus));
poistua (EXIT_SUCCESS);
}

palataEXIT_SUCCESS;
}

Kuten huomaat, joka kerta kun suoritan ohjelman, saan erilaisen 4-numeroisen PIN-koodin.

Joten, pohjimmiltaan käytät fork () -järjestelmäpuhelua Linuxissa. Kiitos tämän artikkelin lukemisesta.