Šakių sistema Skambinkite „Linux“

Fork System Call Linux



Šakės sistemos iškvietimas naudojamas naujiems procesams sukurti. Naujai sukurtas procesas yra vaiko procesas. Procesas, kuris iškviečia šakutę ir sukuria naują procesą, yra pirminis procesas. Vaiko ir tėvų procesai vykdomi vienu metu.

Tačiau vaiko ir tėvų procesai yra skirtingose ​​atminties vietose. Šios atminties vietos turi tą patį turinį ir bet kokia operacija, kurią atlieka vienas procesas, neturės įtakos kitam procesui.







Kai sukuriami vaiko procesai; dabar abu procesai turės tą patį programų skaitiklį (PC), todėl abu šie procesai nurodys tą pačią kitą instrukciją. Tėvų proceso atidaryti failai bus tokie patys kaip antrinio proceso.



Vaiko procesas yra toks pat kaip ir jo pirminis, tačiau procesų ID skiriasi:



  1. Antrinio proceso proceso ID yra unikalus proceso ID, kuris skiriasi nuo visų kitų esamų procesų ID.
  2. Tėvų proceso ID bus toks pat, kaip ir vaiko tėvų proceso ID.

Vaiko proceso savybės

Toliau pateikiamos kai kurios vaiko proceso savybės:





  1. Inicijuojami procesoriaus skaitikliai ir išteklių panaudojimas, kad atstatytų nulį.
  2. Kai pirminis procesas nutraukiamas, antriniai procesai negauna jokio signalo, nes atkurtas atributas PR_SET_PDEATHSIG prctl ().
  3. Siūlas, naudojamas šaukti šakutę (), sukuria antrinį procesą. Taigi vaiko proceso adresas bus toks pat kaip tėvų.
  4. Tėvų proceso failų aprašą paveldi antrinis procesas. Pavyzdžiui, failo poslinkis arba vėliavų būsena ir įvesties/išvesties atributai bus bendrinami tarp antrinių ir pirminių procesų failų aprašų. Taigi pirminės klasės failų aprašas nurodys tą patį antrinės klasės failų aprašą.
  5. Tėvų proceso atvirų pranešimų eilės aprašus paveldi antrinis procesas. Pavyzdžiui, jei failo aprašyme yra pranešimas pirminiame procese, tas pats pranešimas bus pateiktas atitinkamame antrinio proceso failo apraše. Taigi galime pasakyti, kad šių failų aprašų vėliavos reikšmės yra vienodos.
  6. Panašiai atvirus katalogų srautus paveldės antriniai procesai.
  7. Numatytoji antrinės klasės laikmačio laisvumo vertė yra tokia pati kaip dabartinė pirminės klasės laikmačio silpnumo vertė.

Savybės, kurios nėra paveldėtos pagal vaiko procesą

Toliau pateikiamos kai kurios savybės, kurios nėra paveldimos vaiko proceso metu:

  1. Atminties užraktai
  2. Laukiantis vaikų klasės signalas tuščias.
  3. Apdoroti susijusius įrašų užraktus (fcntl ())
  4. Asinchroninės įvesties/išvesties operacijos ir įvesties/išvesties turinys.
  5. Pranešimai apie katalogo keitimą.
  6. Tokie laikmačiai kaip žadintuvas (), nustatymo laikmatis () nėra paveldimi vaikų klasėje.

šakutė () C

Fork () nėra argumentų, o grąžinimo tipas fork () yra sveikas skaičius. Kai naudojate šakutę (), turite įtraukti šiuos antraštės failus:



#įtraukti
#įtraukti
#įtraukti

Dirbant su šakute (), galima naudoti tipui pid_t procesams ID kaip pid_t yra apibrėžtas.

Antraštės failas yra apibrėžtas fork (), todėl jūs turite jį įtraukti į savo programą, kad galėtumėte naudoti fork ().

Grąžinimo tipas yra apibrėžtas ir fork () skambutis yra apibrėžtas. Todėl, norėdami naudoti fork () sistemos iškvietimą, turite įtraukti abu į savo programą.

Šakės sintaksė ()

„Fork“ () sistemos skambučio sintaksė „Linux“, „Ubuntu“ yra tokia:

pid_t šakutė (negalioja);

Sintaksėje grąžinimo tipas yra pid_t . Sėkmingai sukūrus antrąjį procesą, pirminio proceso metu grąžinamas vaiko proceso PID, o 0 bus grąžintas pačiam vaiko procesui.

Jei yra klaida, -1 grąžinamas pirminiam procesui ir antrinis procesas nesukuriamas.

No arguments are passed to fork(). 

1 pavyzdys: šaukimo šakutė ()

Apsvarstykite šį pavyzdį, kuriame panaudojome sistemos šakės () skambutį, kad sukurtume naują antrinį procesą:

KODAS:

#įtraukti
#įtraukti
#įtraukti

tarptpagrindinis()
{
šakutė();
printf („Naudojant sistemos šakės () skambutį n');
grįžti 0;
}

IŠVADA:

Naudojant „fork“ () sistemos iškvietimą
Naudojant „fork“ () sistemos iškvietimą

Šioje programoje mes panaudojome šakutę (), tai sukurs naują vaiko procesą. Kai sukuriamas antrinis procesas, tiek pirminis procesas, tiek antrinis procesas nurodys kitą instrukciją (tą patį programos skaitiklį). Tokiu būdu likusios instrukcijos arba C teiginiai bus įvykdyti iš viso proceso laiko, ty 2nkartų, kur n yra šakės () sistemos iškvietimų skaičius.

Taigi, kai „fork“ () skambutis naudojamas vieną kartą, kaip nurodyta aukščiau (21= 2) turėsime savo produkciją 2 kartus.

Kai naudojamas šakės () sistemos iškvietimas, vidinė struktūra atrodys taip:

Apsvarstykite šį atvejį, kai šakutė () naudojama 4 kartus:

KODAS:

#įtraukti
#įtraukti
#įtraukti

tarptpagrindinis()
{
šakutė();
šakutė();
šakutė();
šakutė();
printf („Naudojamas šakės () sistemos iškvietimas“);
grįžti 0;
}

Išėjimas:

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 

Dabar bendras sukurtų procesų skaičius yra 24= 16, o mūsų spausdinimo pareiškimas įvykdytas 16 kartų.

2 pavyzdys: bandymas, ar šakutė () buvo sėkminga

Šiame pavyzdyje mes panaudojome sprendimų priėmimo konstrukciją, kad patikrintume šakute () grąžintą reikšmę (int). Ir rodomi atitinkami pranešimai:

KODAS:

#įtraukti
#įtraukti
#įtraukti

tarptpagrindinis()
{
pid_t p;
p=šakutė();
jei(p== -1)
{
printf („Skambinant šakute () įvyko klaida“);
}
jei(p==0)
{
printf („Mes esame vaiko procese“);
}
Kitas
{
printf („Mes esame tėvų procese“);
}
grįžti 0;
}

IŠVADA:

Mes esame tėvų procese
Mes dalyvaujame vaiko procese

Pirmiau pateiktame pavyzdyje mes naudojome tipą pid_t, kuris išsaugos šakės () grąžinimo vertę. šakutė () vadinama eilutėje:

p=šakutė();

Taigi šakės () grąžinta sveikojo skaičiaus vertė saugoma p ir tada p lyginama, kad būtų patikrinta, ar mūsų šakės () skambutis buvo sėkmingas.

Kai naudojamas šakės () skambutis ir sėkmingai sukuriamas vaikas, vaiko proceso ID bus grąžintas į pirminį procesą ir 0 bus grąžintas į antrinį procesą. Vaiko proceso ID pagrindiniame procese nebus toks pat kaip Vaiko proceso ID pačiame vaiko procese. Vaiko procese vaiko proceso ID bus 0.

Su šia pamoka galite pamatyti, kaip pradėti naudotis šakės sistemos skambučiu „Linux“.