Šakės sistemos skambutis C

Fork System Call C



„fork“ () sistemos iškvietimas naudojamas kuriant antrinius procesus C programoje. šakutė () naudojama ten, kur jūsų paraiškoje reikalingas lygiagretus apdorojimas. Šakės () sistemos funkcija apibrėžta antraštėse sys/tipai.h ir neprilygstama.h . Programoje, kurioje naudojate šakę, taip pat turite naudoti „wait“ () sistemos skambutį. wait () sistemos skambutis naudojamas laukti pirminiame procese, kol baigsis vaiko procesas. Norėdami užbaigti antrinį procesą, vaiko procese naudojamas išėjimo () sistemos skambutis. Funkcija wait () apibrėžta antraštėje sys/palauk.h ir išeiti () funkcija yra apibrėžta antraštėje stdlib.h .

1 pav. Pagrindinė šakės () darbo eiga

1 pav. Pagrindinė šakės () darbo eiga







Šiame straipsnyje aš jums parodysiu, kaip naudoti „fork“ () sistemos iškvietimą kuriant vaiko procesus C. Taigi, pradėkime.



fork () Sintaksė ir grąžinimo vertė:

Šakės () sistemos funkcijos sintaksė yra tokia:



pid_t šakutė(tuštuma);

Sistemos „fork“ () funkcija nepriima jokių argumentų. Pateikiamas sveikasis skaičius pid_t .





Sėkmės atveju „fork“ () grąžina antrinio proceso PID, kuris yra didesnis nei 0. Antrinio proceso viduje grąžinimo vertė yra 0. Jei „fork“ () nepavyksta, tai grąžina -1.

Paprasta šakutė () Pavyzdys:

Žemiau pateikiamas paprastas šakutės () pavyzdys:



#įtraukti
#įtraukti
#įtraukti
#įtraukti
#įtraukti

tarptpagrindinis(tuštuma) {
pid_t pid=šakutė();

jei(pid== 0) {
printf („Vaikas => PPID: %d PID: %d n',nusiteikęs(),kvailas());
išeiti (EXIT_SUCCESS);
}
Kitas jei(pid> 0) {
printf („Tėvas => PID: %d n',kvailas());
printf („Laukiama, kol baigsis vaiko procesas. n');
laukti(NULL);
printf („Vaiko procesas baigtas. n');
}
Kitas {
printf („Nepavyko sukurti vaiko proceso. n');
}

grįžtiEXIT_SUCCESS;
}

Čia aš naudoju šakutę (), kad sukurtų vaiko procesą iš pagrindinio/pirminio proceso. Tada atspausdinau PID (proceso ID) ir PPID (pirminio proceso ID) iš antrinio ir tėvų proceso. Pagrindinio proceso laukimas (NULL) naudojamas laukti, kol baigsis antrinis procesas. Vykdant antrinį procesą, išėjimas () naudojamas baigti vaiko procesą. Kaip matote, pirminio proceso PID yra antrinio proceso PPID. Taigi, vaiko procesas 24738 priklauso tėvų procesui 24731 .

Taip pat galite naudoti funkcijas, kad jūsų programa būtų moduliškesnė. Čia aš naudojau processTask () ir parentTask () atitinkamai vaiko ir tėvų procesų funkcijos. Taip iš tikrųjų naudojama šakutė ().

#įtraukti
#įtraukti
#įtraukti
#įtraukti
#įtraukti

tuštumavaikas Užduotis() {
printf ('Labas pasauli n');
}

tuštumaparentTask() {
printf ('Pagrindinė užduotis. n');
}

tarptpagrindinis(tuštuma) {
pid_t pid=šakutė();

jei(pid== 0) {
vaikas Užduotis();
išeiti (EXIT_SUCCESS);
}
Kitas jei(pid> 0) {
laukti(NULL);
parentTask();
}
Kitas {
printf („Nepavyko sukurti antrinio proceso“.);
}

grįžtiEXIT_SUCCESS;
}

Aukščiau pateiktos programos rezultatas:

Kelių vaikų procesų vykdymas naudojant šakutę () ir kilpą:

Taip pat galite naudoti ciklą, kad sukurtumėte tiek vaikų procesų, kiek jums reikia. Žemiau pateiktame pavyzdyje aš sukūriau 5 antrinius procesus, naudodamas ciklą. Aš taip pat atspausdinau PID ir PPID iš vaiko procesų.

#įtraukti
#įtraukti
#įtraukti
#įtraukti
#įtraukti

tarptpagrindinis(tuštuma) {
dėl(tarpti= 1;i<= 5;i++) {
pid_t pid=šakutė();

jei(pid== 0) {
printf („Vaiko procesas => PPID =%d, PID =%d n',nusiteikęs(),kvailas());
išeiti (0);
}
Kitas {
printf („Pirminis procesas => PID =%d n',kvailas());
printf („Laukiama, kol baigsis vaiko procesai ... n');
laukti(NULL);
printf ('vaiko procesas baigtas. n');
}
}

grįžtiEXIT_SUCCESS;
}

Kaip matote, pirminio proceso ID yra vienodas visuose antriniuose procesuose. Taigi visi jie priklauso vienam iš tėvų. Jie taip pat vykdomi linijiniu būdu. Vienas po kito. Vaiko procesų valdymas yra sudėtinga užduotis. Jei sužinosite daugiau apie „Linux“ sistemos programavimą ir kaip jis veikia, galėsite kontroliuoti šių procesų eigą bet kuriuo jums patogiu būdu.

Tikro gyvenimo pavyzdys:

Skirtingi sudėtingi matematiniai skaičiavimai, tokie kaip md5, sha256 ir tt maišos generavimas reikalauja daug apdorojimo galios. Užuot skaičiavę tokius dalykus tame pačiame procese kaip ir pagrindinė programa, galite tiesiog apskaičiuoti antrinio proceso maišą ir grąžinti maišą į pagrindinį procesą.

Šiame pavyzdyje aš sukūriau 4 skaitmenų PIN kodą per vaiko procesą ir nusiunčiau jį į pagrindinį procesą, pagrindinę programą. Tada aš atspausdinau PIN kodą iš ten.

#įtraukti
#įtraukti
#įtraukti
#įtraukti
#įtraukti

tarptgetPIN() {
// kaip sėklą naudoti PPID ir PID
srand (kvailas() +nusiteikęs());
tarptpaslaptis= 1000 + eilė () % 9000;
grįžtipaslaptis;
}

tarptpagrindinis(tuštuma) {
tarptfd[2];
vamzdis(fd);
pid_t pid=šakutė();

jei(pid> 0) {
Uždaryti(0);
Uždaryti(fd[1]);
po(fd[0]);

tarptsecretNumber;
dydis_treadBytes=skaityti(fd[0], &secretNumber, dydis(secretNumber));

printf ('Laukiu PIN ... n');
laukti(NULL);
printf („Baitai perskaityti: %ld n',readBytes);
printf („PIN: %d n',secretNumber);
}
Kitas jei(pid== 0) {
Uždaryti(1);
Uždaryti(fd[0]);
po(fd[1]);

tarptpaslaptis=getPIN();
rašyti(fd[1], &paslaptis, dydis(paslaptis));
išeiti (EXIT_SUCCESS);
}

grįžtiEXIT_SUCCESS;
}

Kaip matote, kiekvieną kartą paleisdamas programą gaunu skirtingą 4 skaitmenų PIN kodą.

Taigi, iš esmės taip naudojate „fork“ () sistemos skambutį „Linux“. Dėkojame, kad perskaitėte šį straipsnį.