Gaffel systemanrop i c

Gaffel systemanrop i c
gaffel () Systemanrop brukes til å lage barneprosesser i et C -program. gaffel () brukes der det kreves parallellbehandling i søknaden din. Gaffel () systemfunksjonen er definert i overskriftene SYS/TYPER.h og Unistd.h. I et program der du bruker gaffel, må du også bruke Wait () System Call. Vent () Systemanrop brukes til å vente i overordnede prosess for at barneprosessen skal fullføre. For å fullføre en barneprosess brukes exit () systemanropet i barneprosessen. Vent () -funksjonen er definert i overskriften SYS/Vent.h og avkjørselen () -funksjonen er definert i overskriften stdlib.h.

Fig 1: Grunnleggende gaffel () arbeidsflyt

I denne artikkelen skal jeg vise deg hvordan du bruker gaffel () systemanrop for å lage barneprosesser i C. Så la oss komme i gang.

gaffel () Syntaks og returverdi:

Syntaksen til gaffel () systemfunksjonen er som følger:

pid_t gaffel (tomrom);

Gaffel () systemfunksjonen godtar ikke noe argument. Det returnerer et heltall av typen pid_t.

Ved suksess, Returnerer gaffel () PID på barneprosessen som er større enn 0. Inne i barneprosessen er returverdien 0. Hvis gaffel () mislykkes, kommer den tilbake -1.

Enkel gaffel () Eksempel:

Et enkelt gaffel () eksempel er gitt nedenfor:

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
int main (void)
pid_t pid = gaffel ();
if (pid == 0)
printf ("barn => ppid: %d pid: %d \ n", getPPID (), getpid ());
exit (exit_success);

ellers hvis (pid> 0)
printf ("foreldre => pid: %d \ n", getpid ());
printf ("venter på at barneprosessen skal fullføre.\ n ");
vent (null);
printf ("barneprosess ferdig.\ n ");

annet
printf ("Kan ikke lage barneprosess.\ n ");

return exit_success;

Her brukte jeg gaffel () for å lage en barneprosess fra hoved-/overordnet prosess. Deretter trykte jeg PID (prosess -ID) og PPID (foreldreprosess -ID) fra barn og foreldreprosess. På overordnede prosessen er vent (null) brukt til å vente på at barneprosessen skal fullføre. På barneprosessen brukes exit () til å fullføre barneprosessen. Som du kan se, er PID i overordnede prosessen PPID for barneprosessen. Så barneprosessen 24738 tilhører foreldreprosessen 24731.

Du kan også bruke funksjoner for å gjøre programmet ditt mer modulært. Her brukte jeg ProcessTask () og ParentTask () Funksjoner for henholdsvis barnet og overordnede prosesser. Slik brukes gaffel () faktisk.

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
void childTask ()
Printf ("Hello World \ n");

void parentTask ()
printf ("hovedoppgave.\ n ");

int main (void)
pid_t pid = gaffel ();
if (pid == 0)
childTask ();
exit (exit_success);

ellers hvis (pid> 0)
vent (null);
parentTask ();

annet
printf ("Kan ikke lage barneprosess.");

return exit_success;

Utgangen fra ovennevnte program:

Kjører flere barneprosesser ved hjelp av gaffel () og loop:

Du kan også bruke sløyfe for å lage så mange barneprosesser du trenger. I eksemplet nedenfor har jeg laget 5 barneprosesser som bruker for loop. Jeg trykket også PID og PPID fra barneprosessene.

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
int main (void)
for (int i = 1; i <= 5; i++)
pid_t pid = gaffel ();
if (pid == 0)
printf ("barneprosess => ppid =%d, pid =%d \ n", getPPID (), getPid ());
Avslutt (0);

annet
printf ("Parent prosess => pid =%d \ n", getpid ());
printf ("Venter på at barneprosesser skal fullføre ... \ n");
vent (null);
printf ("barneprosess ferdig.\ n ");


return exit_success;

Som du ser er foreldreprosess -IDen den samme i alle barneprosessene. Så alle tilhører samme foreldre. De kjøres også på lineær måte. Den ene etter den andre. Kontroll av barneprosesser er en sofistikert oppgave. Hvis du lærer mer om Linux -systemprogrammering og hvordan det fungerer, vil du kunne kontrollere flyten av disse prosessene uansett.

Eksempel på det virkelige liv:

Ulike komplekse matematiske beregninger som MD5, SHA256 osv. Hash -generasjon krever mye prosesseringskraft. I stedet for å beregne slike ting i samme prosess som hovedprogrammet, kan du bare beregne hasj på en barneprosess og returnere hasj til hovedprosessen.

I det følgende eksemplet har jeg generert en 4-sifret PIN-kode i en barneprosess og sendt den til overordnet prosess, 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 hemmelighet = 1000 + rand () % 9000;
returhemmelighet;

int main (void)
int fd [2];
rør (FD);
pid_t pid = gaffel ();
if (pid> 0)
Lukk (0);
Lukk (FD [1]);
DUP (FD [0]);
int hemmelignummer;
size_t readBytes = lest (fd [0], & SecretNumber, sizeof (SecretNumber));
printf ("venter på pin ... \ n");
vent (null);
printf ("byte leste: %ld \ n", readbytes);
printf ("pin: %d \ n", hemmelignummer);

ellers hvis (pid == 0)
Lukk (1);
Lukk (FD [0]);
DUP (FD [1]);
int hemmelighet = getPin ();
skriv (FD [1], & Secret, SizeOf (Secret));
exit (exit_success);

return exit_success;

Som du ser, hver gang jeg kjører programmet, får jeg en annen 4-sifret PIN-kode.

Så det er i utgangspunktet slik du bruker gaffel () systemanrop i Linux. Takk for at du leste denne artikkelen.