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.