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.