C Programmeerimine

Kahvli süsteemi kõne C-s

Kahvli süsteemi kõne C-s
süsteemi fork () kõnet kasutatakse C-programmis alamprotsesside loomiseks. kahvlit () kasutatakse juhul, kui teie rakenduses on vaja paralleelset töötlemist. Kahvli () 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õnet kasutatakse vanemaprotsessis lapse protsessi lõpetamise ootamiseks. Lapseprotsessi lõpetamiseks kasutatakse lapseprotsessis süsteemi exit () kõnet. Funktsioon wait () on määratletud päises sys / oota.h ja päises on määratletud funktsioon exit () stdlib.h.

Joonis 1: põhihargi () töövoog

Selles artiklis näitan teile, kuidas kasutada süsteemi fork () kõnet lapseprotsesside loomiseks C-s. Alustame siis.

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

Süsteemi funktsiooni fork () süntaks on järgmine:

pid_t kahvel (tühine);

Süsteemi funktsioon fork () ei aktsepteeri ühtegi argumenti. See tagastab tüübi täisarvu pid_t.

Edukuse korral tagastab fork () lapseprotsessi PID, mis on suurem kui 0. Lapse protsessis on tagastusväärtus 0. Kui kahvel () ebaõnnestub, tagastab see -1.

Lihtkahvel () Näide:

Allpool on toodud lihtne kahvli () näide:

# kaasata
# kaasata
# kaasata
# kaasata
# kaasata
 
int main (tühine)
pid_t pid = kahvel ();
 
kui (pid == 0)
printf ("Laps => PPID:% d PID:% d \ n", getppid (), getpid ());
väljumine (EXIT_SUCCESS);

else if (pid> 0)
printf ("Vanem => PID:% d \ n", getpid ());
printf ("Ootan lapse protsessi lõppu.\ n ");
ootama (NULL);
printf ("Lapse protsess on lõppenud.\ n ");

veel
printf ("Alamprotsessi ei saa luua.\ n ");

 
tagastage EXIT_SUCCESS;

Siin kasutasin kahvlit (), et luua põhiprotsessist / vanemast lapseprotsess. Seejärel printisin lapse ja vanema protsessist PID (protsessi ID) ja PPID (vanema protsessi ID). Vanemprotsessis kasutatakse lapse protsessi lõppemise ootamist (NULL). Lapse protsessis kasutatakse lapse protsessi lõpetamiseks väljumist (). Nagu näete, on vanemprotsessi PID lapsprotsessi PPID. Niisiis, lapse protsess 24738 kuulub vanemaprotsessi 24731.

Funktsioonide abil saate programmi modulaarsemaks muuta. Siin ma kasutasin processTask () ja parentTask () funktsioonid vastavalt lapse ja vanema protsessidele. Nii kasutatakse tegelikult kahvlit ().

# kaasata
# kaasata
# kaasata
# kaasata
# kaasata
 
void childTask ()
printf ("Tere maailm \ n");

 
void parentTask ()
printf ("Põhiülesanne.\ n ");

 
int main (tühine)
pid_t pid = kahvel ();
 
kui (pid == 0)
childTask ();
väljumine (EXIT_SUCCESS);

else if (pid> 0)
ootama (NULL);
parentTask ();

veel
printf ("Alamprotsessi ei saa luua.");

 
tagastage EXIT_SUCCESS;

Eespool nimetatud programmi väljund:

Mitme lapseprotsessi käitamine kahvli () ja aasa abil:

Samuti saate loopi abil luua nii palju lapseprotsesse kui vaja. Allpool toodud näites olen loonud 5 lapseprotsessi, kasutades loopi. Trükkisin ka lapseprotsesside PID ja PPID.

# kaasata
# kaasata
# kaasata
# kaasata
# kaasata
 
int main (tühine)
jaoks (int i = 1; i <= 5; i++)
pid_t pid = kahvel ();
 
kui (pid == 0)
printf ("Lapse protsess => PPID =% d, PID =% d \ n", getppid (), getpid ());
väljumine (0);

veel
printf ("Vanemprotsess => PID =% d \ n", getpid ());
printf ("Alamprotsesside lõpuleviimise ootel ... \ n");
ootama (NULL);
printf ("lapse protsess on lõpetatud.\ n ");


 
tagastage EXIT_SUCCESS;

Nagu näete, on vanemprotsessi ID kõigis alamprotsessides sama. Seega kuuluvad nad kõik samale vanemale. Nad täidavad ka lineaarselt. Üksteise järel. Lapse protsesside kontrollimine on keeruline ülesanne. Kui leiate lisateavet Linuxi süsteemi programmeerimise ja selle toimimise kohta, saate igal juhul nende protsesside voogu juhtida.

Näide tegelikust elust:

Erinevad keerulised matemaatilised arvutused nagu md5, sha256 jne räsi genereerimine nõuavad palju töötlemisvõimsust. Selle asemel, et arvutada põhiprogrammiga samas protsessis selliseid asju, saate lihtsalt arvutada lapse protsessi räsi ja tagastada räsi põhiprotsessi.

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

# kaasata
# kaasata
# kaasata
# kaasata
# kaasata
 
int getPIN ()
// kasutage seemnena PPID ja PID
srand (getpid () + getppid ());
int salajane = 1000 + rand ()% 9000;
tagasisaatmise saladus;

 
int main (tühine)
int fd [2];
toru (fd);
pid_t pid = kahvel ();
 
if (pid> 0)
sulgema (0);
sulgema (fd [1]);
dup (fd [0]);
 
int saladusnumber;
size_t readBytes = loe (fd [0], & secretNumber, sizeof (secretNumber));
 
printf ("PIN-koodi ootamine ... \ n");
ootama (NULL);
printf ("loetud baiti:% ld \ n", readBytes);
printf ("PIN:% d \ n", saladusNumber);

muidu if (pid == 0)
sulgema (1);
sulge (fd [0]);
dup (fd [1]);
 
int saladus = getPIN ();
kirjuta (fd [1], & secret, sizeof (saladus));
väljumine (EXIT_SUCCESS);

 
tagastage EXIT_SUCCESS;

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

Nii et põhimõtteliselt kasutate Linuxis fork () süsteemi kõnet. Täname selle artikli lugemise eest.

Viis parimat mängu püüdmise kaarti
Me kõik oleme YouTube'is voogesituse mänge näinud ja armastanud. PewDiePie, Jakesepticye ja Markiplier on vaid mõned tipptasemel mängijatest, kes on t...
Kuidas mängu Linuxis arendada
Kümme aastat tagasi ei osanud paljud Linuxi kasutajad ennustada, et nende lemmikoperatsioonisüsteem on ühel päeval populaarne kommertsvideomängude män...
Kommertsmängumootorite avatud lähtekoodiga sadamad
Tasuta, avatud lähtekoodiga ja platvormidevaheliste mängumootorite puhkusereise saab kasutada nii vanade kui ka mõnede üsna hiljutiste mängude pealkir...