C Programmering

Gaffelsystemanrop i C

Gaffelsystemanrop i C
fork () systemanrop brukes til å lage underordnede prosesser i et C-program. fork () brukes der parallell behandling er nødvendig i søknaden din. Gaffel () -funksjonen er definert i topptekstene sys / typer.h og unistd.h. I et program der du bruker gaffel, må du også bruke vent () systemanrop. Vent () systemanrop brukes til å vente i foreldreprosessen til barneprosessen er ferdig. For å fullføre en underordnet prosess, brukes systemutropet exit () i barneprosessen. Ventetiden () er definert i overskriften sys / vent.h og exit () -funksjonen er definert i overskriften stdlib.h.

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.

Hvordan vise FPS-teller i Linux-spill
Linux-spill fikk et stort press da Valve kunngjorde Linux-støtte for Steam-klient og spillene deres i 2012. Siden den gang har mange AAA- og indiespil...
Hvordan laste ned og spille Sid Meier's Civilization VI på Linux
Introduksjon til spillet Civilization 6 er et moderne syn på det klassiske konseptet som ble introdusert i serien av Age of Empires-spillene. Ideen va...
Hvordan installere og spille Doom på Linux
Introduksjon til Doom Doom-serien stammer fra 90-tallet etter utgivelsen av den originale Doom. Det ble en øyeblikkelig suksess, og fra den tiden og u...