Sistemski klic vilic v C.

Fork System Call C



Sistemski klic fork () se uporablja za ustvarjanje podrejenih procesov v programu C. fork () se uporablja, kadar je v vaši aplikaciji potrebna vzporedna obdelava. Sistemska funkcija fork () je definirana v glavah sys/types.h in unistd.h . V programu, kjer uporabljate vilice, morate uporabiti tudi sistemski klic wait (). Sistemski klic wait () se uporablja za čakanje na končanje podrejenega procesa v nadrejenem procesu. Za dokončanje podrejenega procesa se v podrejenem procesu uporablja sistemski klic exit (). Funkcija wait () je definirana v glavi sys/wait.h in funkcija exit () je definirana v glavi stdlib.h .

Slika 1: Osnovni potek dela vilic ()

Slika 1: Osnovni potek dela vilic ()







V tem članku vam bom pokazal, kako uporabiti sistemski klic fork () za ustvarjanje podrejenih procesov v C. Torej, začnimo.



fork () Sintaksa in vrnjena vrednost:

Sintaksa sistemske funkcije fork () je naslednja:



vilice pid_t(nično);

Sistemska funkcija fork () ne sprejema nobenega argumenta. Vrne celo število vrste pid_t .





Ob uspehu fork () vrne PID podrejenega procesa, ki je večji od 0. V podrejenem procesu je vrnjena vrednost 0. Če fork () ne uspe, vrne -1.

Preproste vilice () Primer:

Spodaj je naveden preprost primer vilic ():



#vključi
#vključi
#vključi
#vključi
#vključi

intglavni(nično) {
pid_t pid=vilice();

če(pid== 0) {
printf ('Otrok => PPID: %d PID: %d n',getppid(),getpid());
izhod (EXIT_SUCCESS);
}
drugače če(pid> 0) {
printf ('Starš => PID: %d n',getpid());
printf ('Čakanje na dokončanje otroškega procesa. n');
počakaj(NIČ);
printf ('Otroški postopek je končan. n');
}
drugače {
printf ('Ni mogoče ustvariti podrejenega procesa. n');
}

vrnitevEXIT_SUCCESS;
}

Tukaj sem uporabil fork () za ustvarjanje podrejenega procesa iz glavnega/nadrejenega procesa. Nato sem natisnil PID (ID procesa) in PPID (ID starševskega procesa) iz podrejenega in nadrejenega procesa. Na starševskem procesu čakanja (NULL) se uporablja za čakanje na dokončanje podrejenega procesa. V podrejenem procesu se exit () uporablja za dokončanje podrejenega procesa. Kot lahko vidite, je PID nadrejenega procesa PPID podrejenega procesa. Torej, otroški proces 24738 spada v matični proces 24731 .

Uporabite lahko tudi funkcije za povečanje modularnosti programa. Tukaj sem uporabil processTask () in parentTask () funkcije za otrokove in starševske procese. Tako se dejansko uporablja vilica ().

#vključi
#vključi
#vključi
#vključi
#vključi

ničnochildTask() {
printf ('Pozdravljen, svet n');
}

ničnoparentTask() {
printf ('Glavna naloga. n');
}

intglavni(nično) {
pid_t pid=vilice();

če(pid== 0) {
childTask();
izhod (EXIT_SUCCESS);
}
drugače če(pid> 0) {
počakaj(NIČ);
parentTask();
}
drugače {
printf ('Podrejenega procesa ni mogoče ustvariti.');
}

vrnitevEXIT_SUCCESS;
}

Rezultat zgornjega programa:

Izvajanje več podrejenih procesov z uporabo fork () in Loop:

Z zanko lahko ustvarite tudi toliko podrejenih procesov, kot jih potrebujete. V spodnjem primeru sem ustvaril 5 podrejenih procesov z uporabo zanke for. Natisnil sem tudi PID in PPID iz podrejenih procesov.

#vključi
#vključi
#vključi
#vključi
#vključi

intglavni(nično) {
za(intjaz= 1;jaz<= 5;jaz++) {
pid_t pid=vilice();

če(pid== 0) {
printf ('Podrejeni proces => PPID =%d, PID =%d n',getppid(),getpid());
izhod (0);
}
drugače {
printf ('Nadrejeni proces => PID =%d n',getpid());
printf ('Čakanje na dokončanje otroških procesov ... n');
počakaj(NIČ);
printf ('otroški proces končan. n');
}
}

vrnitevEXIT_SUCCESS;
}

Kot lahko vidite, je ID nadrejenega procesa enak v vseh podrejenih procesih. Torej vsi pripadajo istemu staršu. Izvajajo se tudi linearno. Eden za drugim. Nadzor otroških procesov je zahtevna naloga. Če boste izvedeli več o sistemskem programiranju Linuxa in njegovem delovanju, boste lahko nadzirali potek teh procesov, kakor želite.

Primer iz resničnega življenja:

Različni kompleksni matematični izračuni, kot so md5, sha256 itd., Zahtevajo veliko procesorske moči. Namesto, da bi v enakem procesu kot glavni program izračunali take stvari, lahko zgolj izračunate razpršitev v podrejenem procesu in vrnete razpršitev v glavni proces.

V naslednjem primeru sem v podrejenem procesu ustvaril 4-mestno kodo PIN in jo poslal v nadrejeni proces, glavni program. Nato sem od tam natisnil kodo PIN.

#vključi
#vključi
#vključi
#vključi
#vključi

intgetPIN() {
// uporabite PPID in PID kot seme
srand (getpid() +getppid());
intskrivnost= 1000 + vrstici () % 9000;
vrnitevskrivnost;
}

intglavni(nično) {
intfd[2];
cev(fd);
pid_t pid=vilice();

če(pid> 0) {
blizu(0);
blizu(fd[1]);
po(fd[0]);

intsecretNumber;
velikost_treadBytes=prebrati(fd[0], &secretNumber, velikostof(secretNumber));

printf ('Čakanje na PIN ... n');
počakaj(NIČ);
printf ('Prebrani bajti: %ld n',readBytes);
printf („PIN: %d n',secretNumber);
}
drugače če(pid== 0) {
blizu(1);
blizu(fd[0]);
po(fd[1]);

intskrivnost=getPIN();
pisati(fd[1], &skrivnost, velikostof(skrivnost));
izhod (EXIT_SUCCESS);
}

vrnitevEXIT_SUCCESS;
}

Kot lahko vidite, vsakič, ko zaženem program, dobim drugo 4-mestno kodo PIN.

Torej, v bistvu tako uporabljate sistemski klic fork () v Linuxu. Hvala, ker ste prebrali ta članek.