C Programmering

Gaffelsystemopkald i C

Gaffelsystemopkald i C
fork () systemopkald bruges til at oprette underordnede processer i et C-program. fork () bruges hvor parallel behandling er påkrævet i din applikation. Gaffel () systemfunktionen er defineret i overskrifterne sys / typer.h og unistd.h. I et program, hvor du bruger gaffel, skal du også bruge vent () systemopkald. Vent () systemopkald bruges til at vente i den overordnede proces, indtil den underordnede proces er afsluttet. For at afslutte en underordnet proces bruges systemopkaldet exit () i underprocessen. Ventetiden () er defineret i overskriften sys / vent.h og exit () -funktionen er defineret i overskriften stdlib.h.

Fig 1: Grundlæggende gaffel () 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 fork () systemfunktionen er som følger:

pid_t gaffel (ugyldig);

Fork () systemfunktionen accepterer ikke noget argument. Det returnerer et heltal af typen pid_t.

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

Enkel gaffel () Eksempel:

Et simpelt gaffeleksempel () gives nedenfor:

#omfatte
#omfatte
#omfatte
#omfatte
#omfatte
 
int main (ugyldigt)
pid_t pid = gaffel ();
 
hvis (pid == 0)
printf ("Child => PPID:% d PID:% d \ n", getppid (), getpid ());
Afslut (EXIT_SUCCESS);

ellers hvis (pid> 0)
printf ("Parent => PID:% d \ n", getpid ());
printf ("Venter på, at barnets proces er færdig.\ n ");
vent (NULL);
printf ("Underordnet proces afsluttet.\ n ");

andet
printf ("Kan ikke oprette underordnet proces.\ n ");

 
returner EXIT_SUCCESS;

Her brugte jeg fork () til at oprette en underordnet proces fra hoved- / forældreprocessen. Derefter udskrev jeg PID (Process ID) og PPID (Parent Process ID) fra underordnet og forældreproces. På den overordnede proces bruges ventetid (NULL) til at vente på, at barneprocessen er afsluttet. På barnprocessen bruges exit () til at afslutte barneprocessen. Som du kan se, er PID for den overordnede proces PPID for barneprocessen. 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 til henholdsvis barnets og forældrenes processer. Sådan bruges fork () faktisk.

#omfatte
#omfatte
#omfatte
#omfatte
#omfatte
 
ugyldigt childTask ()
printf ("Hello World \ n");

 
ugyldig parentTask ()
printf ("Hovedopgave.\ n ");

 
int main (ugyldigt)
pid_t pid = gaffel ();
 
hvis (pid == 0)
childTask ();
Afslut (EXIT_SUCCESS);

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

andet
printf ("Kan ikke oprette underordnet proces.");

 
returner EXIT_SUCCESS;

Output fra ovenstående program:

Kørsel af flere børneprocesser ved hjælp af fork () og Loop:

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

#omfatte
#omfatte
#omfatte
#omfatte
#omfatte
 
int main (ugyldigt)
for (int i = 1; i <= 5; i++)
pid_t pid = gaffel ();
 
hvis (pid == 0)
printf ("Underordnet proces => PPID =% d, PID =% d \ n", getppid (), getpid ());
exit (0);

andet
printf ("Overordnet proces => PID =% d \ n", getpid ());
printf ("Venter på, at underordnede processer er færdige ... \ n");
vent (NULL);
printf ("underordnet proces afsluttet.\ n ");


 
returner EXIT_SUCCESS;

Som du kan se, er forældreproces-id'et det samme i alle underordnede processer. Så alle hører til den samme forælder. De udfører også lineært. Den ene efter den anden. Kontrol af barneprocesser 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 på virkelige liv:

Forskellige komplekse matematiske beregninger som md5, sha256 osv. Hashgenerering kræver meget processorkraft. I stedet for at beregne sådan noget 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 4-cifret PIN-kode i en underordnet proces og sendt den til den overordnede proces, hovedprogrammet. Derefter udskrev jeg PIN-koden derfra.

#omfatte
#omfatte
#omfatte
#omfatte
#omfatte
 
int getPIN ()
// brug PPID og PID som frø
srand (getpid () + getppid ());
int hemmelighed = 1000 + rand ()% 9000;
returnere hemmelighed;

 
int main (ugyldigt)
int fd [2];
rør (fd);
pid_t pid = gaffel ();
 
hvis (pid> 0)
luk (0);
luk (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 læst:% ld \ n", readBytes);
printf ("PIN:% d \ n", secretNumber);

ellers hvis (pid == 0)
luk (1);
luk (fd [0]);
dup (fd [1]);
 
int hemmelighed = getPIN ();
skriv (fd [1], & hemmelighed, størrelse af (hemmelig));
Afslut (EXIT_SUCCESS);

 
returner EXIT_SUCCESS;

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

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

Bedste apps til Gamepad Mapping til Linux
Hvis du kan lide at spille spil på Linux med en gamepad i stedet for et typisk tastatur- og musesystem, er der nogle nyttige apps til dig. Mange pc-sp...
Nyttige værktøjer til Linux-spillere
Hvis du kan lide at spille spil på Linux, er chancerne for, at du måske har brugt apps og hjælpeprogrammer som Wine, Lutris og OBS Studio for at forbe...
HD Remastered-spil til Linux, der aldrig tidligere havde haft en Linux-udgivelse
Mange spiludviklere og udgivere kommer med HD-remaster af gamle spil for at forlænge franchisens levetid. Venligst fans, der anmoder om kompatibilitet...