Fig 1: Arbeidsflyt for grunnleggende gaffel ()
I denne artikkelen skal jeg vise deg hvordan du bruker fork () systemanrop for å lage barneprosesser i C. Så la oss komme i gang.
fork () Syntaks og returverdi:
Syntaksen til fork () systemfunksjonen er som følger:
pid_t gaffel (ugyldig);Gaffel () -funksjonen godtar ikke noe argument. Det returnerer et helt tall av typen pid_t.
Når det lykkes, returnerer fork () PID for barneprosessen som er større enn 0. Inne i barneprosessen er returverdien 0. Hvis gaffel () mislykkes, returnerer den -1.
Enkel gaffel () Eksempel:
Et enkelt gaffeleksempel () er gitt nedenfor:
#inkludere#inkludere
#inkludere
#inkludere
#inkludere
int main (ugyldig)
pid_t pid = gaffel ();
hvis (pid == 0)
printf ("Child => PPID:% d PID:% d \ n", getppid (), getpid ());
Avslutt (EXIT_SUCCESS);
annet hvis (pid> 0)
printf ("Parent => PID:% d \ n", getpid ());
printf ("Venter på at barneprosessen skal fullføres.\ n ");
vent (NULL);
printf ("Barneprosessen avsluttet.\ n ");
annet
printf ("Kan ikke opprette underordnet prosess.\ n ");
returner EXIT_SUCCESS;
Her brukte jeg fork () for å lage en barneprosess fra hoved- / foreldreprosessen. Deretter skrev jeg ut PID (prosess-ID) og PPID (foreldreprosess-ID) fra barn- og foreldreprosessen. På foreldreprosessen brukes venting (NULL) til å vente på at barneprosessen er ferdig. På barneprosessen brukes exit () for å fullføre barneprosessen. Som du kan se, er PID for foreldreprosessen PPID for barneprosessen. Så, barneprosessen 24738 tilhører foreldreprosessen 24731.
Du kan også bruke funksjoner for å gjøre programmet mer modulært. Her brukte jeg processTask () og foreldreoppgave () funksjoner for henholdsvis barnet og foreldrenes prosesser. Slik brukes fork () faktisk.
#inkludere#inkludere
#inkludere
#inkludere
#inkludere
ugyldig childTask ()
printf ("Hello World \ n");
ugyldig foreldreoppgave ()
printf ("Hovedoppgave.\ n ");
int main (ugyldig)
pid_t pid = gaffel ();
hvis (pid == 0)
childTask ();
Avslutt (EXIT_SUCCESS);
annet hvis (pid> 0)
vent (NULL);
foreldreoppgave ();
annet
printf ("Kan ikke lage underordnet prosess.");
returner EXIT_SUCCESS;
Resultatet av programmet ovenfor:
Kjører flere barneprosesser ved hjelp av fork () og Loop:
Du kan også bruke loop til å lage så mange underordnede prosesser som du trenger. I eksemplet nedenfor har jeg laget 5 barneprosesser ved hjelp av for loop. Jeg skrev også ut PID og PPID fra barneprosessene.
#inkludere#inkludere
#inkludere
#inkludere
#inkludere
int main (ugyldig)
for (int i = 1; i <= 5; i++)
pid_t pid = gaffel ();
hvis (pid == 0)
printf ("Child process => PPID =% d, PID =% d \ n", getppid (), getpid ());
exit (0);
annet
printf ("Overordnet prosess => PID =% d \ n", getpid ());
printf ("Venter på at barneprosesser skal fullføres ... \ n");
vent (NULL);
printf ("barneprosessen ferdig.\ n ");
returner EXIT_SUCCESS;
Som du kan se, er foreldreprosess-IDen den samme i alle underordnede prosesser. Så alle tilhører samme foreldre. De utfører også lineært. Den ene etter den andre. Å kontrollere barneprosesser er en sofistikert oppgave. Hvis du lærer mer om Linux-systemprogrammering og hvordan det fungerer, vil du kunne kontrollere strømmen av disse prosessene uansett hva du vil.
Eksempel på virkelige liv:
Forskjellige komplekse matematiske beregninger som MD5, SHA256 osv. Hasjgenerering krever mye prosessorkraft. I stedet for å beregne sånne ting i samme prosess som hovedprogrammet, kan du bare beregne hasjen på en barneprosess og returnere hasjen til hovedprosessen.
I det følgende eksemplet har jeg generert en firesifret PIN-kode i en underordnet prosess og sendt den til foreldreprosessen, hovedprogrammet. Deretter skrev jeg ut PIN-koden derfra.
#inkludere#inkludere
#inkludere
#inkludere
#inkludere
int getPIN ()
// bruk PPID og PID som frø
srand (getpid () + getppid ());
int hemmelig = 1000 + rand ()% 9000;
tilbake hemmelighet;
int main (ugyldig)
int fd [2];
rør (fd);
pid_t pid = gaffel ();
hvis (pid> 0)
lukk (0);
lukk (fd [1]);
dup (fd [0]);
int secretNumber;
size_t readBytes = read (fd [0], & secretNumber, sizeof (secretNumber));
printf ("Venter på PIN ... \ n");
vent (NULL);
printf ("Bytes lest:% ld \ n", readBytes);
printf ("PIN:% d \ n", secretNumber);
annet hvis (pid == 0)
lukk (1);
lukk (fd [0]);
dup (fd [1]);
int hemmelig = getPIN ();
skriv (fd [1], & hemmelig, størrelse på (hemmelig));
Avslutt (EXIT_SUCCESS);
returner EXIT_SUCCESS;
Som du ser, får jeg en annen firesifret PIN-kode hver gang jeg kjører programmet.
Så det er i utgangspunktet hvordan du bruker fork () systemanrop i Linux. Takk for at du leser denne artikkelen.