Gaffelsystemanrop i C

Fork System Call C



fork () systemanrop brukes til å lage underordnede prosesser i et C -program. fork () brukes der parallellbehandling er nødvendig i søknaden din. Systemfunksjonen for gaffelen () er definert i topptekstene sys/types.h og unistd.h . I et program der du bruker gaffel, må du også bruke vent () systemanrop. wait () systemanrop brukes til å vente i den overordnede prosessen til barneprosessen er fullført. For å fullføre en underordnet prosess, brukes exit () systemanrop i barneprosessen. Vent () -funksjonen er definert i overskriften sys/vent. h og exit () -funksjonen er definert i toppteksten stdlib.h .

Fig 1: Grunnleggende arbeidsflyt for gaffel ()

Fig 1: Grunnleggende arbeidsflyt for gaffel ()







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



fork () Syntaks og returverdi:

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



pid_t gaffel(tomrom);

Systemfunksjonen fork () godtar ikke noe argument. Den returnerer et helt tall av typen pid_t .





Ved suksess returnerer fork () PID for barneprosessen som er større enn 0. Inne i den underordnede prosessen er returverdien 0. Hvis fork () mislykkes, returnerer den -1.

Enkel gaffel () Eksempel:

Et enkelt eksempel på gaffel () er gitt nedenfor:



#inkludere
#inkludere
#inkludere
#inkludere
#inkludere

inthoved-(tomrom) {
pid_t pid=gaffel();

hvis(pid== 0) {
printf ('Barn => PPID: %d PID: %d n',bli lei(),bli lei());
exit (EXIT_SUCCESS);
}
ellers hvis(pid> 0) {
printf ('Forelder => PID: %d n',bli lei());
printf ('Venter på at barneprosessen skal være ferdig. n');
vente(NULL);
printf ('Barneprosessen er fullført. n');
}
ellers {
printf ('Kan ikke opprette barneprosess. n');
}

komme tilbakeEXIT_SUCCESS;
}

Her brukte jeg fork () for å lage en barneprosess fra hoved-/foreldreprosessen. Deretter skrev jeg ut PID (prosess -ID) og PPID (overordnet prosess -ID) fra underordnet og overordnet prosess. På den overordnede prosessen venter (NULL) brukes til å vente på at barneprosessen er fullført. 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 parentTask () funksjoner for henholdsvis barnet og foreldrenes prosesser. Slik brukes faktisk fork ().

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere

tomrombarneoppgave() {
printf ('Hei Verden n');
}

tomromparentTask() {
printf ('Hovedoppgave. n');
}

inthoved-(tomrom) {
pid_t pid=gaffel();

hvis(pid== 0) {
barneoppgave();
exit (EXIT_SUCCESS);
}
ellers hvis(pid> 0) {
vente(NULL);
parentTask();
}
ellers {
printf ('Kan ikke opprette barneprosess.');
}

komme tilbakeEXIT_SUCCESS;
}

Utdataene fra programmet ovenfor:

Kjøre flere barneprosesser med gaffel () og løkke:

Du kan også bruke loop til å lage så mange barneprosesser som du trenger. I eksemplet nedenfor har jeg opprettet 5 underordnede prosesser som bruker for loop. Jeg skrev også ut PID og PPID fra barneprosessene.

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere

inthoved-(tomrom) {
til(intJeg= 1;Jeg<= 5;Jeg++) {
pid_t pid=gaffel();

hvis(pid== 0) {
printf ('Barneprosess => PPID =%d, PID =%d n',bli lei(),bli lei());
exit (0);
}
ellers {
printf ('Overordnet prosess => PID =%d n',bli lei());
printf ('Venter på at barneprosesser skal være ferdige ... n');
vente(NULL);
printf (barneprosessen er fullført. n');
}
}

komme tilbakeEXIT_SUCCESS;
}

Som du kan se, er overordnet prosess -ID den samme i alle underordnede prosesser. Så alle tilhører den samme forelder. De utfører 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 du liker.

Eksempel på virkelige liv:

Ulike komplekse matematiske beregninger som md5, sha256 etc hashgenerering krever mye prosessorkraft. I stedet for å beregne slike ting i samme prosess som hovedprogrammet, kan du bare beregne hasjen på en underordnet prosess og returnere hasjen til hovedprosessen.

I det følgende eksemplet har jeg generert en firesifret PIN-kode i en barneprosess og sendt den til den overordnede prosessen, hovedprogrammet. Deretter skrev jeg ut PIN -koden derfra.

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere

intgetPIN() {
// bruk PPID og PID som frø
srand (bli lei() +bli lei());
inthemmelig= 1000 + rad () % 9000;
komme tilbakehemmelig;
}

inthoved-(tomrom) {
intfd[2];
rør(fd);
pid_t pid=gaffel();

hvis(pid> 0) {
Lukk(0);
Lukk(fd[1]);
etter(fd[0]);

intsecretNumber;
størrelse_treadBytes=lese(fd[0], &secretNumber, størrelsen av(secretNumber));

printf ('Venter på PIN -kode ... n');
vente(NULL);
printf ('Bytes lese: %ld n',readBytes);
printf ('PIN: %d n',secretNumber);
}
ellers hvis(pid== 0) {
Lukk(1);
Lukk(fd[0]);
etter(fd[1]);

inthemmelig=getPIN();
skrive(fd[1], &hemmelig, størrelsen av(hemmelig));
exit (EXIT_SUCCESS);
}

komme tilbakeEXIT_SUCCESS;
}

Som du kan se, 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 leste denne artikkelen.