C Programmeren

Fork systeemoproep in C

Fork systeemoproep in C
fork() systeemaanroep wordt gebruikt om onderliggende processen in een C-programma te maken. fork() wordt gebruikt waar parallelle verwerking vereist is in uw toepassing. De systeemfunctie fork() is gedefinieerd in de headers sys/types.h en unistd.h. In een programma waarin je fork gebruikt, moet je ook wait() system call gebruiken. wait() systeemaanroep wordt gebruikt om in het bovenliggende proces te wachten totdat het onderliggende proces is voltooid. Om een ​​kindproces te beëindigen, wordt de systeemaanroep exit() gebruikt in het onderliggende proces. De functie wait() is gedefinieerd in de header sys/wacht.h en de exit() functie is gedefinieerd in de header stdlib.h.

Fig 1: Basis fork() workflow

In dit artikel laat ik je zien hoe je de systeemaanroep fork() gebruikt om onderliggende processen te maken in C. Dus laten we beginnen.

fork() Syntaxis en retourwaarde:

De syntaxis van de systeemfunctie fork() is als volgt:

pid_t fork (ongeldig);

De systeemfunctie fork() accepteert geen enkel argument. Het retourneert een geheel getal van het type pid_t.

Bij succes retourneert fork() de PID van het onderliggende proces dat groter is dan 0. Binnen het onderliggende proces is de retourwaarde 0. Als fork() mislukt, retourneert het -1.

Eenvoudige fork() Voorbeeld:

Een eenvoudig fork()-voorbeeld wordt hieronder gegeven:

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

anders if(pid > 0)
printf("Ouder => PID: %d\n", getpid());
printf("Wachten tot het onderliggende proces is voltooid.\n");
wacht (NULL);
printf("Kindproces voltooid.\n");

anders
printf("Kan het onderliggende proces niet maken.\n");

 
retourneer EXIT_SUCCESS;

Hier heb ik fork() gebruikt om een ​​kindproces te maken van het hoofd-/ouderproces. Vervolgens heb ik de PID (proces-ID) en PPID (ouderproces-ID) van het kind- en ouderproces afgedrukt. Op het bovenliggende proces wordt wait (NULL) gebruikt om te wachten tot het onderliggende proces is voltooid. Op het onderliggende proces wordt exit() gebruikt om het onderliggende proces te beëindigen. Zoals u kunt zien, is de PID van het bovenliggende proces de PPID van het onderliggende proces. Dus het kindproces 24738 behoort tot het bovenliggende proces 24731.

U kunt ook functies gebruiken om uw programma modulair te maken. Hier, ik gebruikte procesTaak() en ouderTaak() functies voor respectievelijk de onderliggende en bovenliggende processen. Dit is hoe fork() daadwerkelijk wordt gebruikt.

#include
#include
#include
#include
#include
 
ongeldige childTask()
printf("Hallo wereld\n");

 
ongeldige parentTask()
printf("Hoofdtaak.\n");

 
int main(void)
pid_t pid = vork();
 
if(pid == 0)
kindTaak();
afsluiten (EXIT_SUCCESS);

anders if(pid > 0)
wacht (NULL);
ouderTaak();

anders
printf("Kan het onderliggende proces niet maken.");

 
retourneer EXIT_SUCCESS;

De output van het bovenstaande programma:

Meerdere onderliggende processen uitvoeren met fork() en Loop:

U kunt lus ook gebruiken om zoveel onderliggende processen te maken als u nodig hebt. In het onderstaande voorbeeld heb ik 5 onderliggende processen gemaakt met for loop. Ik heb ook de PID en PPID van de onderliggende processen afgedrukt.

#include
#include
#include
#include
#include
 
int main(void)
for(int i = 1; i <= 5; i++)
pid_t pid = vork();
 
if(pid == 0)
printf("Kinderproces => PPID=%d, PID=%d\n", getppid(), getpid());
uitgang(0);

anders 
printf("Ouderproces => PID=%d\n", getpid());
printf("Wachten tot onderliggende processen klaar zijn... \n");
wacht (NULL);
printf("onderliggend proces voltooid.\n");


 
retourneer EXIT_SUCCESS;

Zoals je kunt zien, is de bovenliggende proces-ID hetzelfde in alle onderliggende processen. Dus ze behoren allemaal tot dezelfde ouder. Ze worden ook lineair uitgevoerd. De een na de ander. Het beheersen van onderliggende processen is een ingewikkelde taak. Als je meer leert over Linux-systeemprogrammering en hoe het werkt, kun je de stroom van deze processen besturen zoals je wilt.

Voorbeeld uit het echte leven:

Verschillende complexe wiskundige berekeningen zoals md5, sha256 enz. Hash-generatie vereist veel verwerkingskracht. In plaats van dat soort dingen in hetzelfde proces als het hoofdprogramma te berekenen, kun je gewoon de hash van een onderliggend proces berekenen en de hash teruggeven aan het hoofdproces.

In het volgende voorbeeld heb ik een 4-cijferige pincode gegenereerd in een kindproces en deze naar het bovenliggende proces gestuurd, het hoofdprogramma. Daarna heb ik de pincode van daaruit afgedrukt.

#include
#include
#include
#include
#include
 
int getPIN()
// gebruik PPID en PID als het zaad
srand(getpid() + getppid());
int geheim = 1000 + rand() % 9000;
terug geheim;

 
int main(void)
int fd[2];
pijp (fd);
pid_t pid = vork();
 
if(pid > 0)
sluiten(0);
sluiten(fd[1]);
dup(fd[0]);
 
int geheimNummer;
size_t readBytes = read(fd[0], &secretNumber, sizeof(secretNumber));
 
printf("Wachten op pincode... \n");
wacht (NULL);
printf("Bytes gelezen: %ld\n", readBytes);
printf("PIN: %d\n", geheimNummer);

anders if(pid == 0)
sluiten(1);
sluiten(fd[0]);
dup(fd[1]);
 
int geheim = getPIN();
write(fd[1], &secret, sizeof(secret));
afsluiten (EXIT_SUCCESS);

 
retourneer EXIT_SUCCESS;

Zoals je kunt zien, krijg ik elke keer dat ik het programma start een andere 4-cijferige pincode.

Dus dat is eigenlijk hoe je fork() systeemaanroep in Linux gebruikt. Bedankt voor het lezen van dit artikel.

Top Oculus App Lab-games
Als je eigenaar bent van een Oculus-headset, moet je op de hoogte zijn van sideloading. Sideloading is het proces van het installeren van niet-winkeli...
Top 10 spellen om te spelen op Ubuntu
Het Windows-platform is een van de dominante platforms voor gaming geweest vanwege het enorme percentage games dat tegenwoordig wordt ontwikkeld om Wi...
5 beste arcade-spellen voor Linux
Tegenwoordig zijn computers serieuze machines die worden gebruikt om te gamen. Als je de nieuwe hoge score niet kunt halen, weet je wat ik bedoel. In ...