Gaffelsystemsamtal
Gaffelsystemanropet används för att skapa nya processer. Den nyskapade processen är barnprocessen. Processen som kallar fork och skapar en ny process är överordnadsprocessen. Barn- och föräldraprocesserna utförs samtidigt.
Men processerna för barn och föräldrar finns i olika minnesutrymmen. Dessa minnesutrymmen har samma innehåll och vilken operation som utförs av en process påverkar inte den andra processen.
När barnets processer skapas; nu kommer båda processerna att ha samma programräknare (PC), så båda dessa processer kommer att peka på samma nästa instruktion. De filer som öppnas av överordnadsprocessen kommer att vara desamma för barnprocessen.
Barnprocessen är exakt densamma som dess förälder men det finns skillnad i process-ID: n:
- Process-ID för barnprocessen är ett unikt process-ID som skiljer sig från ID: n för alla andra befintliga processer.
- Föräldraprocess-ID kommer att vara detsamma som för process-ID för barnets förälder.
Egenskaper hos barnprocessen
Följande är några av de egenskaper som en underordnad process har:
- CPU-räknarna och resursanvändningarna initialiseras för att återställas till noll.
- När överordnadsprocessen avslutas får inte underprocesser någon signal eftersom PR_SET_PDEATHSIG-attributet i prctl () återställs.
- Tråden som används för att ringa fork () skapar barnprocessen. Så adressen till barnprocessen kommer att vara densamma som förälderns.
- Filbeskrivaren för föräldraprocessen ärvs av barnprocessen. Till exempel kommer förskjutningen av filen eller flaggans status och I / O-attributen att delas mellan filbeskrivarna för barn- och föräldraprocesser. Så filbeskrivare för överordnad klass kommer att hänvisa till samma filbeskrivare för underklass.
- De öppna meddelandeköbeskrivarna för föräldraprocessen ärvs av barnprocessen. Till exempel om en filbeskrivare innehåller ett meddelande i överordnad process kommer samma meddelande att finnas i motsvarande filbeskrivare för underprocessen. Så vi kan säga att flaggvärdena för dessa filbeskrivare är desamma.
- På samma sätt ärvs öppna katalogströmmar av barnprocesserna.
- Standardvärdet för timerklack för underklassen är detsamma som det aktuella timerlackvärdet för föräldraklassen.
Egenskaper som inte ärvs av Child-processen
Följande är några av de egenskaper som inte ärvs av en underordnad process:
- Minneslås
- Den väntande signalen från en barnklass är tom.
- Bearbeta associerade postlås (fcntl ())
- Asynkrona I / O-operationer och I / O-innehåll.
- Meddelanden om katalogändringar.
- Timers som alarm (), setitimer () ärvs inte av barnklassen.
gaffel () i C
Det finns inga argument i fork () och returtypen för fork () är heltal. Du måste inkludera följande rubrikfiler när fork () används:
#omfatta#omfatta
#omfatta
När du arbetar med gaffel (),
Rubrikfilen
Returtypen definieras i
Gaffelsyntax ()
Syntaxen för gaffel () systemanrop i Linux, Ubuntu är som följer:
pid_t gaffel (ogiltig);I syntaxen är returtypen pid_t. När barnprocessen har skapats framgångsrikt returneras PID för barnprocessen i överordnadsprocessen och 0 returneras till själva barnprocessen.
Om det finns något fel returneras -1 till överordnadsprocessen och barnprocessen skapas inte.
Inga argument skickas till gaffel ().
Exempel 1: Calling fork ()
Tänk på följande exempel där vi har använt gaffel () systemanropet för att skapa en ny underordnad process:
KODA:
#omfatta#omfatta
#omfatta
int main ()
gaffel();
printf ("Använd gaffel () systemanrop \ n");
returnera 0;
PRODUKTION:
Med systemanropet från fork ()Använd gaffel () systemanrop
I det här programmet har vi använt fork (), detta skapar en ny barnprocess. När barnprocessen skapas kommer både föräldraprocessen och barnprocessen att peka på nästa instruktion (samma programräknare). På detta sätt kommer de återstående instruktionerna eller C-satserna att köras det totala antalet procestider, det vill säga 2n gånger, där n är antalet fork () systemanrop.
Så när fork () -anropet används en gång som ovan (21 = 2) vi kommer att ha vår produktion två gånger.
Här när systemanropet från fork () används kommer den interna strukturen att se ut:
Tänk på följande fall där gaffeln () används fyra gånger:
KODA:
#omfatta#omfatta
#omfatta
int main ()
gaffel();
gaffel();
gaffel();
gaffel();
printf ("Använd gaffel () systemanrop");
returnera 0;
Produktion:
Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop Använda gaffel () systemanrop
Nu är det totala antalet skapade processer 24 = 16 och vårt utskriftsuttalande körs 16 gånger.
Exempel 2: Testa om gaffel () lyckades
I följande exempel har vi använt beslutsfattandet för att testa värdet (int) som returneras av gaffel (). Och motsvarande meddelanden visas:
KODA:
#omfatta#omfatta
#omfatta
int main ()
pid_t p;
p = gaffel ();
om (p == - 1)
printf ("Det uppstod ett fel när du anropade fork ()");
om (p == 0)
printf ("Vi är i barnprocessen");
annan
printf ("Vi är i moderprocessen");
returnera 0;
PRODUKTION:
Vi är i föräldraprocessenVi är i barnprocessen
I exemplet ovan har vi använt typen pid_t som lagrar returvärdet för gaffeln (). gaffel () kallas online:
p = gaffel ();Så det heltalsvärde som returneras av fork () lagras i p och sedan jämförs p för att kontrollera om vårt fork () -samtal lyckades.
När fork () -anropet används och barnet har skapats framgångsrikt, kommer barnprocessens id att returneras till överordnad process och 0 kommer att returneras till underprocessen.ID för barnprocess i föräldraprocessen kommer inte att vara samma som ID för barnprocess i själva barnprocessen. I barnprocessen kommer ID för barnprocessen att vara 0.
Med den här guiden kan du se hur du kommer igång med gaffelsystemet i Linux.