Haarukkajärjestelmä Soita Linuxille

Fork System Call Linux



Haarukkajärjestelmän kutsua käytetään uusien prosessien luomiseen. Uusi prosessi on lapsiprosessi. Prosessi, joka kutsuu haarukan ja luo uuden prosessin, on pääprosessi. Lapsi- ja vanhempiprosessit suoritetaan samanaikaisesti.

Mutta lapsen ja vanhemman prosessit sijaitsevat eri muistitiloissa. Näillä muistitiloilla on sama sisältö, ja mitä tahansa yhden prosessin suorittama toiminto ei vaikuta toiseen prosessiin.







Kun aliprosessit luodaan; nyt molemmilla prosesseilla on sama ohjelmalaskuri (PC), joten molemmat prosessit osoittavat samaan seuraavaan ohjeeseen. Pääprosessin avaamat tiedostot ovat samat aliprosessille.



Lapsiprosessi on täsmälleen sama kuin vanhempi, mutta prosessitunnuksissa on eroja:



  1. Aliprosessin prosessitunnus on ainutlaatuinen prosessitunnus, joka eroaa kaikkien muiden olemassa olevien prosessien tunnuksista.
  2. Vanhemman prosessitunnus on sama kuin lapsen vanhemman prosessitunnus.

Lapsiprosessin ominaisuudet

Seuraavassa on joitain lapsiprosessin ominaisuuksia:





  1. CPU -laskurit ja resurssien käyttö on nollattava.
  2. Kun pääprosessi lopetetaan, aliprosessit eivät vastaanota signaalia, koska PR_SET_PDEATHSIG -attribuutti kohdassa prctl () nollataan.
  3. Haarukan () kutsumiseen käytetty säie luo aliprosessin. Joten lapsiprosessin osoite on sama kuin vanhemman osoite.
  4. Pääprosessin tiedostonkuvaaja periytyy aliprosessista. Esimerkiksi tiedoston siirto tai lippujen tila ja I/O -attribuutit jaetaan ali- ja pääprosessien tiedostojen kuvaajien kesken. Joten vanhemman luokan tiedostokuvaaja viittaa samaan lapsiluokan tiedostokuvaajaan.
  5. Pääprosessin avoimen viestin jonon kuvaajat perivät aliprosessi. Jos esimerkiksi tiedoston kuvaaja sisältää viestin pääprosessissa, sama viesti on läsnä aliprosessin vastaavassa tiedoston kuvaajassä. Voimme siis sanoa, että näiden tiedostojen kuvausten lippuarvot ovat samat.
  6. Vastaavasti avoimet hakemistovirrat peritään aliprosesseissa.
  7. Lapsiluokan ajastimen löysyysarvo on sama kuin vanhemman luokan nykyinen ajastimen löysyysarvo.

Ominaisuudet, joita lapsiperhe ei peri

Seuraavassa on joitain ominaisuuksia, jotka eivät peri lapsiprosessia:

  1. Muisti lukittuu
  2. Lapsiluokan odottava signaali on tyhjä.
  3. Prosessiin liittyvät tietuelukot (fcntl ())
  4. Asynkroniset I/O -toiminnot ja I/O -sisältö.
  5. Ilmoitukset hakemiston muutoksista.
  6. Ajastimet, kuten hälytys (), asetusajastin (), eivät peri lapsiluokalta.

haarukka () C: ssä

Forkissa () ei ole argumentteja ja haarukan () palautustyyppi on kokonaisluku. Sinun on sisällytettävä seuraavat otsikkotiedostot, kun haarukkaa () käytetään:



#sisältää
#sisältää
#sisältää

Haarukalla () työskenneltäessä voidaan käyttää tyyppiä pid_t prosessitunnuksille pid_t on määritelty kohdassa.

Otsikkotiedosto on paikka, jossa haarukka () määritellään, joten sinun on sisällytettävä se ohjelmaan, jotta voit käyttää haarukkaa ().

Palautustyyppi määritellään ja haarukka () -puhelu määritellään. Siksi sinun on sisällytettävä molemmat ohjelmaan, jotta voit käyttää fork () -järjestelmäkutsua.

Haarukan syntaksi ()

Fork () -järjestelmäkutsun syntaksi Linuxissa, Ubuntussa on seuraava:

pid_t haarukka (mitätön);

Syntaksissa palautustyyppi on pid_t . Kun aliprosessi on luotu onnistuneesti, aliprosessin PID palautetaan pääprosessissa ja 0 palautetaan aliprosessiin.

Jos virheitä ilmenee, -1 palautetaan pääprosessiin eikä aliprosessia luoda.

No arguments are passed to fork(). 

Esimerkki 1: Soittohaarukka ()

Harkitse seuraavaa esimerkkiä, jossa olemme käyttäneet haarukan () järjestelmäkutsua uuden aliprosessin luomiseen:

KOODI:

#sisältää
#sisältää
#sisältää

inttärkein()
{
haarukka();
printf ('Haarukan () järjestelmäkutsun käyttö n'');
palata 0;
}

LÄHTÖ:

Fork () -järjestelmäpuhelun käyttäminen
Fork () -järjestelmäpuhelun käyttäminen

Tässä ohjelmassa olemme käyttäneet haarukkaa (), tämä luo uuden aliprosessin. Kun aliprosessi luodaan, sekä pääprosessi että aliprosessi osoittavat seuraavaan ohjeeseen (sama ohjelmalaskuri). Tällä tavalla jäljellä olevat ohjeet tai C -käskyt suoritetaan prosessiaikojen kokonaismääräksi, eli 2nkertaa, jolloin n on haarukoiden () järjestelmäkutsujen määrä.

Joten kun haarukan () puhelua käytetään kerran kuten edellä (21= 2) saamme tuotoksemme 2 kertaa.

Kun haarukan () järjestelmäkutsua käytetään, sisäinen rakenne näyttää tältä:

Harkitse seuraavaa tapausta, jossa haarukkaa () käytetään 4 kertaa:

KOODI:

#sisältää
#sisältää
#sisältää

inttärkein()
{
haarukka();
haarukka();
haarukka();
haarukka();
printf ('Haarukan () järjestelmäkutsun käyttäminen');
palata 0;
}

Lähtö:

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 

Nyt luotujen prosessien kokonaismäärä on 24= 16 ja tulosteemme suoritetaan 16 kertaa.

Esimerkki 2: Haarukan () onnistumisen testaaminen

Seuraavassa esimerkissä olemme käyttäneet päätöksentekorakennetta haarukan () palauttaman arvon (int) testaamiseen. Ja vastaavat viestit näytetään:

KOODI:

#sisältää
#sisältää
#sisältää

inttärkein()
{
pid_t s;
s=haarukka();
jos(s== -1)
{
printf ('Virhe soitettaessa haarukkaan ()');
}
jos(s==0)
{
printf ('Olemme lapsiprosessissa');
}
muu
{
printf ('Olemme vanhempainprosessissa');
}
palata 0;
}

LÄHTÖ:

Olemme vanhempainprosessissa
Olemme lapsiprosessissa

Yllä olevassa esimerkissä olemme käyttäneet pid_t -tyyppiä, joka tallentaa haarukan () palautusarvon. fork () kutsutaan verkossa:

s=haarukka();

Joten haarukan () palauttama kokonaislukuarvo tallennetaan p: hen ja p: tä verrataan sen tarkistamiseen, onko haarukan () kutsumme onnistunut.

Kun haarukan () puhelua käytetään ja lapsi luodaan onnistuneesti, aliprosessin tunnus palautetaan pääprosessille ja 0 palautetaan aliprosessille. Lapsiprosessin tunnus vanhemman prosessissa ei ole sama kuin Lapsiprosessin tunnus lapsiprosessissa itsessään. Lapsiprosessissa lapsiprosessin tunnus on 0.

Tämän opetusohjelman avulla näet, miten pääset alkuun haarukkajärjestelmän kutsun kanssa Linuxissa.