Gaffelsystemopkald i C

Fork System Call C



fork () systemopkald bruges til at oprette underordnede processer i et C -program. fork () bruges, hvor parallel behandling er påkrævet i din ansøgning. Systemfunktionen gaffel () er defineret i overskrifterne sys/types.h og unistd.h . I et program, hvor du bruger gaffel, skal du også bruge vent () systemopkald. wait () systemopkald bruges til at vente i den overordnede proces, indtil barneprocessen er afsluttet. For at afslutte en underordnet proces bruges systemkaldet exit () i barneprocessen. Vent () -funktionen er defineret i overskriften sys/wait.h og funktionen exit () er defineret i overskriften stdlib.h .

Fig 1: Grundgaffel () arbejdsgang

Fig 1: Grundgaffel () arbejdsgang







I denne artikel vil jeg vise dig, hvordan du bruger fork () systemopkald til at oprette underordnede processer i C. Så lad os komme i gang.



fork () Syntaks og returværdi:

Syntaksen for gaffel () systemfunktionen er som følger:



pid_t gaffel(ugyldig);

Systemfunktionen fork () accepterer ikke noget argument. Det returnerer et helt tal af typen pid_t .





Ved succes returnerer fork () PID for den underordnede proces, der er større end 0. Inde i den underordnede proces er returværdien 0. Hvis fork () mislykkes, returnerer den -1.

Enkel gaffel () Eksempel:

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



#omfatte
#omfatte
#omfatte
#omfatte
#omfatte

intvigtigste(ugyldig) {
pid_t pid=gaffel();

hvis(pid== 0) {
printf ('Barn => PPID: %d PID: %d n',blive ked af det(),getpid());
Afslut (EXIT_SUCCESS);
}
andet hvis(pid> 0) {
printf ('Forælder => PID: %d n',getpid());
printf ('Venter på, at barneprocessen er færdig. n');
vente(NUL);
printf ('Børneprocessen er afsluttet. n');
}
andet {
printf ('Kan ikke oprette underordnet proces. n');
}

Vend tilbageEXIT_SUCCESS;
}

Her brugte jeg fork () til at oprette en børneproces ud fra hoved-/forælderprocessen. Derefter udskriver jeg PID (proces -id) og PPID (forælder -proces -id) fra underordnet og overordnet proces. På den overordnede proces venter (NULL) bruges til at vente på, at barneprocessen er færdig. I barneprocessen bruges exit () til at afslutte barneprocessen. Som du kan se, er PID for den overordnede proces PPID for den underordnede proces. Så barneprocessen 24738 tilhører forældreprocessen 24731 .

Du kan også bruge funktioner til at gøre dit program mere modulært. Her brugte jeg processTask () og parentTask () funktioner for henholdsvis barnet og forældrenes processer. Sådan bruges fork () faktisk.

#omfatte
#omfatte
#omfatte
#omfatte
#omfatte

ugyldigbarn opgave() {
printf ('Hej Verden n');
}

ugyldigparentTask() {
printf ('Hovedopgave. n');
}

intvigtigste(ugyldig) {
pid_t pid=gaffel();

hvis(pid== 0) {
barn opgave();
Afslut (EXIT_SUCCESS);
}
andet hvis(pid> 0) {
vente(NUL);
parentTask();
}
andet {
printf ('Kan ikke oprette underordnet proces.');
}

Vend tilbageEXIT_SUCCESS;
}

Output af ovenstående program:

Kørsel af flere børneprocesser ved hjælp af gaffel () og sløjfe:

Du kan også bruge loop til at oprette så mange underordnede processer, som du har brug for. I eksemplet herunder har jeg oprettet 5 underordnede processer ved hjælp af for loop. Jeg har også printet PID og PPID fra de underordnede processer.

#omfatte
#omfatte
#omfatte
#omfatte
#omfatte

intvigtigste(ugyldig) {
til(intjeg= 1;jeg<= 5;jeg++) {
pid_t pid=gaffel();

hvis(pid== 0) {
printf ('Underordnet proces => PPID =%d, PID =%d n',blive ked af det(),getpid());
Afslut (0);
}
andet {
printf ('Overordnet proces => PID =%d n',getpid());
printf ('Venter på, at børneprocesser er færdige ... n');
vente(NUL);
printf ('børneprocessen er afsluttet. n');
}
}

Vend tilbageEXIT_SUCCESS;
}

Som du kan se, er forælderproces -id'et det samme i alle underordnede processer. Så alle tilhører den samme forælder. De udfører også lineært. Den ene efter den anden. Kontrol af børneprocesser er en sofistikeret opgave. Hvis du lærer mere om Linux -systemprogrammering og hvordan det fungerer, vil du være i stand til at kontrollere strømmen af ​​disse processer, uanset hvad du vil.

Eksempel fra det virkelige liv:

Forskellige komplekse matematiske beregninger såsom md5, sha256 osv. Hashgenerering kræver meget processorkraft. I stedet for at beregne sådanne ting i samme proces som hovedprogrammet, kan du bare beregne hash på en underordnet proces og returnere hash til hovedprocessen.

I det følgende eksempel har jeg genereret en firecifret PIN-kode i en børneproces og sendt den til den overordnede proces, hovedprogrammet. Derefter printede jeg pinkoden derfra.

#omfatte
#omfatte
#omfatte
#omfatte
#omfatte

intgetPIN() {
// brug PPID og PID som frø
srand (getpid() +blive ked af det());
inthemmelighed= 1000 + række () % 9000;
Vend tilbagehemmelighed;
}

intvigtigste(ugyldig) {
intfd[2];
rør(fd);
pid_t pid=gaffel();

hvis(pid> 0) {
tæt(0);
tæt(fd[1]);
efter(fd[0]);

inthemmeligt nummer;
størrelse_treadBytes=Læs(fd[0], &hemmeligt nummer, størrelse på(hemmeligt nummer));

printf ('Venter på pinkode ... n');
vente(NUL);
printf ('Bytes læst: %ld n',readBytes);
printf ('PIN: %d n',hemmeligt nummer);
}
andet hvis(pid== 0) {
tæt(1);
tæt(fd[0]);
efter(fd[1]);

inthemmelighed=getPIN();
skrive(fd[1], &hemmelighed, størrelse på(hemmelighed));
Afslut (EXIT_SUCCESS);
}

Vend tilbageEXIT_SUCCESS;
}

Som du kan se, hver gang jeg kører programmet, får jeg en anden 4-cifret PIN-kode.

Så det er dybest set, hvordan du bruger fork () systemopkald i Linux. Tak fordi du læste denne artikel.