C Programiranje

Fork sistemski klic v C

Fork sistemski klic v C
sistemski klic fork () se uporablja za ustvarjanje podrejenih procesov v programu C. fork () se uporablja tam, kjer je v vaši aplikaciji potrebna vzporedna obdelava. Funkcija sistema fork () je definirana v glavah sys / vrste.h in unistd.h. V programu, v katerem uporabljate vilice, morate uporabiti tudi sistemski klic wait (). wait () sistemski klic se uporablja za čakanje v nadrejenem procesu, da se nadrejeni postopek konča. Za dokončanje podrejenega procesa se v podrejenem procesu uporablja sistemski klic exit (). Funkcija wait () je definirana v glavi sys / počakaj.h in funkcija exit () je definirana v glavi stdlib.h.

Slika 1: Osnovni potek 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 (void);

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

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

Preprosta vilica () Primer:

Spodaj je naveden preprost primer fork ():

#include
#include
#include
#include
#include
 
int main (void)
pid_t pid = fork ();
 
če (pid == 0)
printf ("Child => PPID:% d PID:% d \ n", getppid (), getpid ());
izhod (EXIT_SUCCESS);

sicer če (pid> 0)
printf ("Nadrejeni => PID:% d \ n", getpid ());
printf ("Čakam, da se podrejeni postopek konča.\ n ");
počakajte (NULL);
printf ("Podrejeni postopek je končan.\ n ");

sicer
printf ("Podrejenega procesa ni mogoče ustvariti.\ n ");

 
vrni EXIT_SUCCESS;

Tu sem uporabil fork () za ustvarjanje podrejenega procesa iz glavnega / nadrejenega procesa. Nato sem natisnil PID (ID procesa) in PPID (Nadrejeni ID procesa) iz nadrejenega in nadrejenega procesa. V nadrejenem procesu čakanje (NULL) se uporablja za čakanje, da se podrejeni postopek konča. V podrejenem postopku se z izhodom () konča podrejeni postopek. Kot lahko vidite, je PID nadrejenega procesa PPID nadrejenega procesa. Torej, proces otrok 24738 pripada nadrejenemu procesu 24731.

Funkcije lahko uporabite tudi za bolj modularen program. Tukaj sem uporabil processTask () in nadrejena naloga () funkcije za podrejeni in nadrejeni proces. Tako se dejansko uporablja fork ().

#include
#include
#include
#include
#include
 
void childTask ()
printf ("Pozdravljeni, svet \ n");

 
void parentTask ()
printf ("Glavna naloga.\ n ");

 
int main (void)
pid_t pid = fork ();
 
če (pid == 0)
otrokTask ();
izhod (EXIT_SUCCESS);

sicer če (pid> 0)
počakajte (NULL);
nadrejena naloga ();

sicer
printf ("Podrejenega procesa ni mogoče ustvariti.");

 
vrni EXIT_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. Prav tako sem natisnil PID in PPID iz podrejenih procesov.

#include
#include
#include
#include
#include
 
int main (void)
za (int i = 1; i <= 5; i++)
pid_t pid = fork ();
 
če (pid == 0)
printf ("Podrejeni postopek => PPID =% d, PID =% d \ n", getppid (), getpid ());
izhod (0);

sicer
printf ("Nadrejeni postopek => PID =% d \ n", getpid ());
printf ("Čakanje, da se podrejeni procesi končajo ... \ n");
počakajte (NULL);
printf ("podrejeni postopek je končan.\ n ");


 
vrni EXIT_SUCCESS;

Kot lahko vidite, je ID starševskega procesa enak v vseh podrejenih procesih. Torej, vsi pripadajo istemu staršu. Izvajajo se tudi linearno. Ena za drugo. Nadzor nad otroškimi procesi je izpopolnjena naloga. Če boste izvedeli več o sistemskem programiranju Linux in kako to deluje, boste lahko kadar koli želeli nadzirati potek teh procesov.

Primer iz resničnega življenja:

Različni zapleteni matematični izračuni, kot so md5, sha256 itd. Generiranje razprševanja, zahtevajo veliko procesorske moči. Namesto da v istem postopku kot glavni program računate takšne stvari, lahko samo izračunate zgoščenost v podrejenem procesu in vrnete razpršitev v glavni postopek.

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

#include
#include
#include
#include
#include
 
int getPIN ()
// kot seme uporabimo PPID in PID
srand (getpid () + getppid ());
int skrivnost = 1000 + rand ()% 9000;
povratna skrivnost;

 
int main (void)
int fd [2];
cev (fd);
pid_t pid = fork ();
 
če (pid> 0)
zapri (0);
zapri (fd [1]);
dup (fd [0]);
 
int secretNumber;
size_t readBytes = read (fd [0], & secretNumber, sizeof (secretNumber));
 
printf ("Čakanje na PIN ... \ n");
počakajte (NULL);
printf ("Prebrani bajti:% ld \ n", readBytes);
printf ("PIN:% d \ n", tajna številka);

sicer če (pid == 0)
zapri (1);
zapri (fd [0]);
dup (fd [1]);
 
int skrivnost = getPIN ();
write (fd [1], & secret, sizeof (secret));
izhod (EXIT_SUCCESS);

 
vrni EXIT_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.

10 najboljših iger za igranje v Ubuntuju
Platforma Windows je bila ena izmed prevladujočih platform za igre na srečo zaradi velikega odstotka iger, ki se danes razvijajo za naravno podporo si...
5 najboljših arkadnih iger za Linux
Dandanes so računalniki resni stroji, ki se uporabljajo za igre na srečo. Če ne boste mogli dobiti novega visokega rezultata, boste vedeli, kaj mislim...
Bitka za Wesnoth 1.13.6 Razvoj izdan
Bitka za Wesnoth 1.13.6, ki je izšel prejšnji mesec, je šesta razvojna izdaja v 1.13.x series in prinaša številne izboljšave, predvsem uporabniški vme...