Fork System Call Linux

Fork System Call Linux



Gaffelsystemsamtalet används för att skapa nya processer. Den nyskapade processen är barnprocessen. Processen som kallar gaffel och skapar en ny process är överordnad process. Barn- och förälderprocesserna utförs samtidigt.

Men barn- och förälderprocesserna ligger på 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. Filerna som öppnas av den överordnade processen kommer att vara desamma för barnprocessen.



Barnprocessen är exakt densamma som föräldern men det finns skillnad i process -ID: n:



  1. Process -ID för barnprocessen är ett unikt process -ID som skiljer sig från ID: n för alla andra befintliga processer.
  2. Föräldraprocess -ID är samma som för process -ID för barnets förälder.

Egenskaper för barnprocess

Följande är några av de egenskaper som en underordnad process innehar:





  1. CPU -räknare och resursanvändningar initieras för att återställa till noll.
  2. När den överordnade processen avslutas får inga underordnade processer någon signal eftersom attributet PR_SET_PDEATHSIG i prctl () återställs.
  3. Tråden som används för att kalla fork () skapar barnprocessen. Så adressen till barnprocessen kommer att vara densamma som förälderns.
  4. Filbeskrivningen för förälderprocessen ärvs av barnprocessen. Exempelvis kommer förskjutningen av filen eller status för flaggor och I/O -attribut att delas mellan filbeskrivningarna för underordnade och överordnade processer. Så filbeskrivare för föräldraklass kommer att hänvisa till samma filbeskrivning för underordnad klass.
  5. De öppna meddelandeköbeskrivningarna för överordnad process ärvs av den underordnade processen. Till exempel om en filbeskrivare innehåller ett meddelande i överordnad process kommer samma meddelande att finnas i motsvarande filbeskrivning för underordnad process. Så vi kan säga att flaggvärdena för dessa filbeskrivare är desamma.
  6. På samma sätt ärvs öppna katalogströmmar av de underordnade processerna.
  7. Standardvärdet för timer -slack för underordnad klass är samma som det aktuella timer -slack -värdet för föräldraklass.

Egenskaper som inte ärvs av barnprocessen

Följande är några av de egenskaper som inte ärvs av en underordnad process:

  1. Minneslås
  2. Den väntande signalen från en barnklass är tom.
  3. Behandla associerade postlås (fcntl ())
  4. Asynkrona I/O -operationer och I/O -innehåll.
  5. Katalogändringsmeddelanden.
  6. Timers som alarm (), setitimer () ärvs inte av barnklassen.

gaffel () i C

Det finns inga argument i fork () och returtypen gaffel () är ett heltal. Du måste inkludera följande rubrikfiler när gaffel () används:



#omfatta
#omfatta
#omfatta

Vid arbete med gaffel (), kan användas för typ pid_t för processer -ID: n som pid_t definieras i.

Rubrikfilen är där fork () definieras så att du måste inkludera den i ditt program för att använda fork ().

Returtypen definieras i och anrop för fork () definieras i. Därför måste du inkludera båda i ditt program för att använda fork () systemanrop.

Syntax för gaffel ()

Syntaxen för gaffel () systemanrop i Linux, Ubuntu är följande:

pid_t gaffel (void);

I syntaxen är returtypen pid_t . När barnprocessen har skapats, returneras PID för barnprocessen i förälderprocessen och 0 återförs till själva barnprocessen.

Om det finns något fel returneras -1 till överordnad process och underordnad process skapas inte.

No arguments are passed to fork(). 

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

inthuvud()
{
gaffel();
printf ('Med hjälp av systemgaffel () n');
lämna tillbaka 0;
}

PRODUKTION:

Använda systemgaffel ()
Använda systemgaffel ()

I det här programmet har vi använt fork (), detta kommer att skapa en ny barnprocess. När barnprocessen skapas kommer både förälderprocessen 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 processider, det vill säga 2ngånger, där n är antalet gaffel () systemanrop.

Så när gaffel () -anropet används en gång enligt ovan (21= 2) vi kommer att ha vår produktion 2 gånger.

När gaffel () systemanropet används ser den interna strukturen ut så här:

Tänk på följande fall där gaffeln () används 4 gånger:

KODA:

#omfatta
#omfatta
#omfatta

inthuvud()
{
gaffel();
gaffel();
gaffel();
gaffel();
printf ('Använda gaffel () systemanrop');
lämna tillbaka 0;
}

Produktion:

Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call 

Nu är det totala antalet skapade processer 24= 16 och vi har utfört vårt tryckuttalande 16 gånger.

Exempel 2: Testa om gaffel () lyckades

I följande exempel har vi använt beslutskonstruktionen för att testa värdet (int) som returneras av fork (). Och motsvarande meddelanden visas:

KODA:

#omfatta
#omfatta
#omfatta

inthuvud()
{
pid_t sid;
sid=gaffel();
om(sid== -1)
{
printf ('Det uppstår ett fel när du ringer till fork ()');
}
om(sid==0)
{
printf ('Vi är i barnprocessen');
}
annan
{
printf ('Vi är i förälderprocessen');
}
lämna tillbaka 0;
}

PRODUKTION:

Vi är i förälderprocessen
Vi är i barnprocessen

I exemplet ovan har vi använt typen pid_t som lagrar returvärdet för gaffel (). fork () kallas online:

sid=gaffel();

Så heltalet som returneras av fork () lagras i p och sedan jämförs p för att kontrollera om vårt gaffel () -samtal lyckades.

När gaffel () -anropet används och barnet skapas framgångsrikt, kommer id för barnprocess att återföras till överordnad process och 0 kommer att återgå till barnprocessen. ID för underordnad process i överordnad process är inte samma sak ID för barnprocess i själva barnprocessen. I barnprocessen är barnets process -ID 0.

Med denna handledning kan du se hur du kommer igång med gaffelsystemsamtalet i Linux.