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.