Kahvlisüsteem Helista Linuxile

Fork System Call Linux



Kahvelsüsteemi kõnet kasutatakse uute protsesside loomiseks. Äsja loodud protsess on lapsprotsess. Protsess, mis kutsub üles kahvli ja loob uue protsessi, on emaprotsess. Lapse ja vanema protsessid viiakse läbi samaaegselt.

Kuid lapse ja vanema protsessid asuvad erinevates mäluruumides. Nendel mäluruumidel on sama sisu ja mis tahes toiming, mida üks protsess teostab, ei mõjuta teist protsessi.







Kui lapsprotsessid on loodud; nüüd on mõlemal protsessil sama programmiloendur (PC), seega viitavad mõlemad protsessid samale järgmisele juhisele. Vanemprotsessi avatud failid on alamprotsessi jaoks samad.



Alamprotsess on täpselt sama, mis tema vanem, kuid protsesside ID -des on erinevusi:



  1. Alamprotsessi protsessi ID on ainulaadne protsessi ID, mis erineb kõigi teiste olemasolevate protsesside ID -st.
  2. Vanema protsessi ID on sama, mis lapse vanema protsessi ID.

Lapseprotsessi omadused

Siin on mõned omadused, mida lapsprotsess omab:





  1. Protsessori loendurid ja ressursikasutus lähtestatakse nullimiseks.
  2. Kui vanemprotsess on lõpetatud, ei saa alamprotsessid signaali, kuna prctl () atribuut PR_SET_PDEATHSIG lähtestatakse.
  3. Lõng, mida kasutatakse kahvli () kutsumiseks, loob alamprotsessi. Seega on lapsprotsessi aadress sama, mis vanemal.
  4. Vanemprotsessi failikirjeldaja pärib alamprotsess. Näiteks faili nihke või lippude olek ja I/O atribuudid jagatakse alam- ja vanemprotsesside failide kirjelduste vahel. Seega viitab vanemklassi failikirjutaja samale alamklassi failikirjutajale.
  5. Vanemprotsessi avatud sõnumijärjekorra kirjeldused pärib alamprotsess. Näiteks kui failikirjeldus sisaldab emaprotsessis sõnumit, on sama teade ka alamprotsessi vastavas failikirjelduses. Seega võime öelda, et nende failide kirjelduste lipuväärtused on samad.
  6. Sarnaselt pärivad alamprotsessid avatud kataloogivoogusid.
  7. Alamklassi taimeri lõtku vaikeväärtus on sama, mis vanemklassi praegune taimerite lõtk.

Atribuudid, mida alamprotsess ei päri

Järgnevalt on toodud mõned omadused, mis ei ole päritud alamprotsessi kaudu.

  1. Mälu lukustub
  2. Alamklassi ootel signaal on tühi.
  3. Töötle seotud kirjelukud (fcntl ())
  4. Asünkroonsed I/O toimingud ja I/O sisu.
  5. Kataloogimuudatusteated.
  6. Taimereid nagu alarm (), setitimer () ei alanda alamklass.

kahvel () C -s

Fork () -is pole argumente ja kahvli () tagastustüüp on täisarv. Kui kasutate kahvlit (), peate lisama järgmised päisefailid:



#kaasake
#kaasake
#kaasake

Kahvel () töötamisel saab kasutada tüübi jaoks pid_t protsesside jaoks on ID määratletud pid_t.

Päisefail on see, kus fork () on määratletud, nii et peate selle oma programmi lisama, et kasutada kahvlit ().

Tagastustüüp on määratletud ja fork () kõne määratletud. Seetõttu peate kahvli () süsteemikõne kasutamiseks oma programmi lisama mõlemad.

Kahvli süntaks ()

Fork () süsteemikõne süntaks Linuxis, Ubuntu on järgmine:

pid_t kahvel (tühine);

Tagastustüüp on süntaksis pid_t . Kui alamprotsess on edukalt loodud, tagastatakse lapseprotsessi PID vanemprotsessis ja 0 tagastatakse alamprotsessile endale.

Vigade korral tagastatakse vanemprotsessile -1 ja alamprotsessi ei looda.

No arguments are passed to fork(). 

Näide 1: kahvlihark ()

Mõelge järgmisele näitele, kus oleme kasutanud kahvli () süsteemi kutset uue alamprotsessi loomiseks:

KOOD:

#kaasake
#kaasake
#kaasake

intpeamine()
{
kahvel();
printf ('Fork () süsteemikõne kasutamine n');
tagasi 0;
}

VÄLJUND:

Fork () süsteemikõne kasutamine
Fork () süsteemikõne kasutamine

Selles programmis oleme kasutanud kahvlit (), see loob uue alamprotsessi. Alamprotsessi loomisel osutavad nii vanemprotsess kui ka alamprotsess järgmisele juhisele (sama programmiloendur). Sel viisil täidetakse ülejäänud juhised või C -laused protsesside koguarvuga, st 2nkorda, kus n on kahvli () süsteemikõnede arv.

Nii et kui kahvli () kõnet kasutatakse üks kord, nagu eespool (21= 2) saame oma väljundi 2 korda.

Siin, kui kasutatakse süsteemi kahvlit (), näeb sisemine struktuur välja selline:

Mõelge järgmisele juhtumile, kus kahvlit () kasutatakse 4 korda:

KOOD:

#kaasake
#kaasake
#kaasake

intpeamine()
{
kahvel();
kahvel();
kahvel();
kahvel();
printf ('Fork () süsteemikõne kasutamine');
tagasi 0;
}

Väljund:

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 

Nüüd on loodud protsesside koguarv 24= 16 ja meie trükijäljendit täidetakse 16 korda.

Näide 2: testimine, kas kahvel () õnnestus

Järgmises näites oleme kasutanud otsustuskonstruktsiooni, et testida kahvli () abil tagastatud väärtust (int). Ja kuvatakse vastavad teated:

KOOD:

#kaasake
#kaasake
#kaasake

intpeamine()
{
pid_t lk;
lk=kahvel();
kui(lk== -1)
{
printf ('Kahvel () kutsumisel ilmnes viga);
}
kui(lk==0)
{
printf ('Oleme lapsprotsessis');
}
muidu
{
printf ('Oleme vanemprotsessis');
}
tagasi 0;
}

VÄLJUND:

Oleme vanemate protsessis
Oleme lapseprotsessis

Ülaltoodud näites oleme kasutanud tüüpi pid_t, mis salvestab kahvli () tagastusväärtuse. kahvlit () kutsutakse real:

lk=kahvel();

Seega salvestatakse kahvli () poolt tagastatud täisarvu väärtus p -s ja seejärel võrreldakse p -d, et kontrollida, kas meie kahvli () kõne oli edukas.

Kui kasutate kahvli () kõnet ja laps on edukalt loodud, tagastatakse alamprotsessi id vanemprotsessile ja 0 tagastatakse alamprotsessile. Lapseprotsessi ID vanemprotsessis ei ole sama, mis Lapseprotsessi ID lapsprotsessis endas. Lapsprotsessis on lapseprotsessi ID 0.

Selle õpetuse abil näete, kuidas alustada kahvli süsteemikõnega Linuxis.