C Programmering

Gaffelsystemanrop i C

Gaffelsystemanrop i C
fork () systemanrop används för att skapa underordnade processer i ett C-program. fork () används där parallell bearbetning krävs i din applikation. Gaffelsystemets () funktion definieras i rubrikerna sys / typer.h och unistd.h. I ett program där du använder gaffel måste du också använda vänta () systemanrop. vänta () systemanrop används för att vänta i överordnadsprocessen tills barnprocessen är klar. För att avsluta en barnprocess används systemanropet exit () i barnprocessen. Vänta () -funktionen definieras i rubriken sys / vänta.h och funktionen exit () definieras i rubriken stdlib.h.

Fig 1: Arbetsflöde för grundgaffel ()

I den här artikeln ska jag visa dig hur du använder gaffel () systemanrop för att skapa barnprocesser i C. Så, låt oss komma igång.

fork () Syntax och returvärde:

Syntaxen för gaffel () systemfunktionen är som följer:

pid_t gaffel (ogiltig);

Fork () systemfunktionen accepterar inget argument. Det returnerar ett heltal av typen pid_t.

Vid framgång returnerar fork () PID för barnprocessen som är större än 0. Inuti barnprocessen är returvärdet 0. Om gaffel () misslyckas returnerar den -1.

Enkel gaffel () Exempel:

Ett enkelt gaffel () exempel ges nedan:

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta
 
int main (void)
pid_t pid = gaffel ();
 
if (pid == 0)
printf ("Child => PPID:% d PID:% d \ n", getppid (), getpid ());
avsluta (EXIT_SUCCESS);

annars om (pid> 0)
printf ("Parent => PID:% d \ n", getpid ());
printf ("Väntar på att barnprocessen ska avslutas.\ n ");
vänta (NULL);
printf ("Barnprocessen är klar.\ n ");

annat
printf ("Det går inte att skapa underordnad process.\ n ");

 
returnera EXIT_SUCCESS;

Här använde jag fork () för att skapa en underprocess från huvud- / föräldraprocessen. Sedan skrev jag ut PID (Process ID) och PPID (Parent Process ID) från barn- och föräldraprocessen. På den överordnade processen väntar (NULL) används för att vänta tills barnprocessen är klar. På barnprocessen används exit () för att avsluta barnprocessen. Som du kan se är PID för den överordnade processen PPID för barnprocessen. Så barnprocessen 24738 tillhör föräldraprocessen 24731.

Du kan också använda funktioner för att göra ditt program mer modulärt. Här brukade jag processTask () och parentTask () funktioner för barnets respektive föräldrarnas processer. Så här används fork ().

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta
 
ogiltigt childTask ()
printf ("Hello World \ n");

 
ogiltig parentTask ()
printf ("Huvuduppgift.\ n ");

 
int main (void)
pid_t pid = gaffel ();
 
if (pid == 0)
childTask ();
avsluta (EXIT_SUCCESS);

annars om (pid> 0)
vänta (NULL);
parentTask ();

annat
printf ("Det går inte att skapa underordnad process.");

 
returnera EXIT_SUCCESS;

Resultatet från ovanstående program:

Köra flera barnprocesser med fork () och Loop:

Du kan också använda loop för att skapa så många underordnade processer som du behöver. I exemplet nedan har jag skapat 5 underordnade processer som använder för loop. Jag skrev också ut PID och PPID från barnprocesserna.

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta
 
int main (void)
för (int i = 1; i <= 5; i++)
pid_t pid = gaffel ();
 
if (pid == 0)
printf ("Child process => PPID =% d, PID =% d \ n", getppid (), getpid ());
exit (0);

annat
printf ("Överordnad process => PID =% d \ n", getpid ());
printf ("Väntar på att barnprocesser ska slutföras ... \ n");
vänta (NULL);
printf ("underordnad process avslutad.\ n ");


 
returnera EXIT_SUCCESS;

Som du kan se är föräldraprocess-ID detsamma i alla underprocesser. Så alla tillhör samma förälder. De kör också linjärt. En efter den andra. Kontroll av barnprocesser är en sofistikerad uppgift. Om du lär dig mer om Linux-systemprogrammering och hur det fungerar kan du styra flödet av dessa processer hur som helst du vill.

Exempel på verkliga livet:

Olika komplexa matematiska beräkningar som md5, sha256 etc hashgenerering kräver mycket processorkraft. Istället för att beräkna sådana saker i samma process som huvudprogrammet kan du bara beräkna hash på en underprocess och returnera hash till huvudprocessen.

I följande exempel har jag genererat en fyrsiffrig PIN-kod i en underprocess och skickat den till den överordnade processen, huvudprogrammet. Sedan skrev jag ut PIN-koden därifrån.

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta
 
int getPIN ()
// använd PPID och PID som utsäde
srand (getpid () + getppid ());
int hemlig = 1000 + rand ()% 9000;
återvänd hemlighet;

 
int main (void)
int fd [2];
rör (fd);
pid_t pid = gaffel ();
 
if (pid> 0)
stäng (0);
stäng (fd [1]);
dup (fd [0]);
 
int secretNumber;
size_t readBytes = read (fd [0], & secretNumber, sizeof (secretNumber));
 
printf ("Väntar på PIN ... \ n");
vänta (NULL);
printf ("Byte läst:% ld \ n", readBytes);
printf ("PIN:% d \ n", secretNumber);

annars om (pid == 0)
stäng (1);
stäng (fd [0]);
dup (fd [1]);
 
int hemlighet = getPIN ();
skriv (fd [1], & hemlighet, storlek på (hemlighet));
avsluta (EXIT_SUCCESS);

 
returnera EXIT_SUCCESS;

Som du kan se får jag en annan fyrsiffrig PIN-kod varje gång jag kör programmet.

Så det är i princip hur du använder fork () systemanrop i Linux. Tack för att du läste den här artikeln.

Mus Markören hoppar eller rör sig slumpmässigt när du skriver in Windows 10
Markören hoppar eller rör sig slumpmässigt när du skriver in Windows 10
Om du upptäcker att muspekaren hoppar eller rör sig på egen hand, automatiskt, slumpmässigt när du skriver in Windows-bärbar dator eller dator, kan nå...
Mus Så här vänder du mus- och styrplattans rullningsriktning i Windows 10
Så här vänder du mus- och styrplattans rullningsriktning i Windows 10
Mus och Pekplattas gör inte bara datoranvändning lättare men effektivare och mindre tidskrävande. Vi kan inte föreställa oss ett liv utan dessa enhete...
Mus Så här ändrar du muspekare och markörstorlek, färg och schema på Windows 10
Så här ändrar du muspekare och markörstorlek, färg och schema på Windows 10
Muspekaren och markören i Windows 10 är mycket viktiga aspekter av operativsystemet. Detta kan också sägas för andra operativsystem, så i sanning är d...