Gaffelsystemsamtal i C

Fork System Call C



fork () systemanrop används för att skapa underordnade processer i ett C -program. fork () används där parallellbehandling krävs i din ansökan. Funktionen gaffel () är definierad i rubrikerna sys/types.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 den överordnade processen för att barnprocessen ska slutföras. För att avsluta en underordnad process används systemets samtal () i barnprocessen. Funktionen wait () definieras i rubriken sys/vänta. h och funktionen exit () definieras i rubriken stdlib.h .

Fig 1: Grundgaffel () arbetsflöde

Fig 1: Grundgaffel () arbetsflöde







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



fork () Syntax och returvärde:

Syntaxen för gaffel () systemfunktionen är följande:



pid_t gaffel(tomhet);

Systemfunktionen fork () accepterar inte något 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 underprocessen är returvärdet 0. Om gaffel () misslyckas, returnerar den -1.

Enkel gaffel () Exempel:

Ett enkelt exempel på gaffel () ges nedan:



#omfatta
#omfatta
#omfatta
#omfatta
#omfatta

inthuvud(tomhet) {
pid_t pid=gaffel();

om(pid== 0) {
printf ('Barn => PPID: %d PID: %d n',bli upprörd(),bli ledsen());
utgång (EXIT_SUCCESS);
}
annan om(pid> 0) {
printf ('Parent => PID: %d n',bli ledsen());
printf ('Väntar på att barnprocessen ska vara klar. n');
vänta(NULL);
printf ('Barnprocessen är klar. n');
}
annan {
printf ('Det går inte att skapa en barnprocess. n');
}

lämna tillbakaEXIT_SUCCESS;
}

Här använde jag fork () för att skapa en barnprocess från huvud-/förälderprocessen. Sedan skrev jag ut PID (Process ID) och PPID (Parent Process ID) från barn och förälderprocess. På den överordnade processen väntar (NULL) används för att vänta på att barnprocessen är klar. I 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älderprocessen 24731 .

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

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta

tomhetbarnuppgift() {
printf ('Hej världen n');
}

tomhetparentTask() {
printf ('Huvuduppgift. n');
}

inthuvud(tomhet) {
pid_t pid=gaffel();

om(pid== 0) {
barnuppgift();
utgång (EXIT_SUCCESS);
}
annan om(pid> 0) {
vänta(NULL);
parentTask();
}
annan {
printf ('Det går inte att skapa en barnprocess.');
}

lämna tillbakaEXIT_SUCCESS;
}

Utdata från ovanstående program:

Köra flera barnprocesser med gaffel () 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 med hjälp av for loop. Jag skrev också ut PID och PPID från barnprocesserna.

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta

inthuvud(tomhet) {
för(inti= 1;i<= 5;i++) {
pid_t pid=gaffel();

om(pid== 0) {
printf ('Barnprocess => PPID =%d, PID =%d n',bli upprörd(),bli ledsen());
utgång (0);
}
annan {
printf ('Parent process => PID =%d n',bli ledsen());
printf ('Väntar på att barnprocesser ska slutföra ... n');
vänta(NULL);
printf ('barnprocessen är klar. n');
}
}

lämna tillbakaEXIT_SUCCESS;
}

Som du kan se är föräldraprocess -ID detsamma i alla underordnade processer. Så alla tillhör samma förälder. De utför också på linjärt sätt. En efter den andra. Att kontrollera barnprocesser är en sofistikerad uppgift. Om du lär dig mer om Linux -systemprogrammering och hur det fungerar kommer du att kunna styra flödet av dessa processer hur du än 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 underordnad process och returnera hash till huvudprocessen.

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

#omfatta
#omfatta
#omfatta
#omfatta
#omfatta

intgetPIN() {
// använd PPID och PID som utsäde
srand (bli ledsen() +bli upprörd());
inthemlighet= 1000 + rad () % 9000;
lämna tillbakahemlighet;
}

inthuvud(tomhet) {
intfd[2];
rör(fd);
pid_t pid=gaffel();

om(pid> 0) {
stänga(0);
stänga(fd[1]);
efter(fd[0]);

inthemligt nummer;
storlek_treadBytes=läsa(fd[0], &hemligt nummer, storlek av(hemligt nummer));

printf ('Väntar på PIN ... n');
vänta(NULL);
printf ('Bytes läst: %ld n',readBytes);
printf ('PIN: %d n',hemligt nummer);
}
annan om(pid== 0) {
stänga(1);
stänga(fd[0]);
efter(fd[1]);

inthemlighet=getPIN();
skriva(fd[1], &hemlighet, storlek av(hemlighet));
utgång (EXIT_SUCCESS);
}

lämna tillbakaEXIT_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 gaffel () systemanrop i Linux. Tack för att du läste denna artikel.