„Linux Exec“ sistemos skambutis

Linux Exec System Call



Vykdymo sistemos iškvietimas naudojamas vykdyti failą, esantį aktyviame procese. Kai vadinama exec, ankstesnis vykdomasis failas pakeičiamas ir vykdomas naujas failas.

Tiksliau, galime pasakyti, kad naudojant „exec“ sistemos iškvietimą senas failas ar programa bus pakeisti nauju failu ar programa. Visas proceso turinys pakeičiamas nauja programa.







Vartotojo duomenų segmentas, vykdantis „exec“ () sistemos iškvietimą, pakeičiamas duomenų rinkmena, kurios pavadinimas nurodomas argumente skambinant „exec“ ().



Nauja programa įkeliama į tą pačią proceso erdvę. Dabartinis procesas yra tiesiog paverstas nauju procesu, todėl proceso ID PID nekeičiamas, nes mes nesukuriame naujo proceso, mes tiesiog pakeičiame procesą kitu vykdymo procesu.



Jei šiuo metu vykdomame procese yra daugiau nei viena gija, visos gijos bus nutrauktos, o naujas proceso vaizdas bus įkeltas ir įvykdytas. Nėra destruktorių funkcijų, kurios nutrauktų dabartinio proceso gijas.





Proceso PID nekeičiamas, tačiau proceso duomenys, kodas, krūva, krūva ir kt. Yra keičiami ir pakeičiami naujai įkelto proceso duomenimis. Naujas procesas vykdomas nuo įėjimo taško.

„Exec“ sistemos iškvietimas yra funkcijų rinkinys, o C programavimo kalba šių funkcijų standartiniai pavadinimai yra šie:



  1. vykd
  2. egzelis
  3. execlp
  4. vykd
  5. vykdyti
  6. vykd


Čia reikia pažymėti, kad šios funkcijos turi tą pačią bazę vykd po to viena ar daugiau raidžių. Jie paaiškinami toliau:

Ir: Tai rodyklių masyvas, nurodantis aplinkos kintamuosius ir aiškiai perduodamas naujai įkeliamam procesui.

: l skirtas komandų eilutės argumentams perduoti funkcijai sąrašą

p: p yra kelio aplinkos kintamasis, padedantis rasti failą, perduotą kaip argumentą įkelti į procesą.

v: v skirtas komandinės eilutės argumentams. Jie perduodami kaip funkcijų rodyklių masyvas.

Kodėl naudojamas exec?

„exec“ naudojamas, kai vartotojas nori paleisti naują failą ar programą tame pačiame procese.

Vidaus vykdomasis darbas

Norėdami suprasti vykdytojo darbą, apsvarstykite šiuos dalykus:

  1. Dabartinis proceso vaizdas perrašomas nauju proceso vaizdu.
  2. Naujas proceso vaizdas yra tas, kurį perdavėte kaip vykdomąjį argumentą
  3. Šiuo metu vykdomas procesas baigtas
  4. Naujas proceso vaizdas turi tą patį proceso ID, tą pačią aplinką ir tą patį failo aprašą (nes procesas nepakeičiamas proceso vaizdas pakeičiamas)
  5. Tai turi įtakos procesoriaus būsenai ir virtualiai atminčiai. Dabartinio proceso vaizdo virtualios atminties atvaizdavimas pakeičiamas naujo proceso vaizdo virtualia atmintimi.

„Exec“ šeimos funkcijų sintaksės:

Toliau pateikiamos kiekvienos „exec“ funkcijos sintaksės:

int execl (const char* kelias, const char* arg, ...)
int execlp (const char* failas, const char* arg, ...)
int execle (const char* kelias, const char* arg,…, char* const envp [])
int execv (const char* kelias, const char* argv [])
int execvp (const char* failas, const char* argv [])
int execvpe (const char* failas, const char* argv [], char* const envp [])

Apibūdinimas:

Šių funkcijų grąžinimo tipas yra Int. Sėkmingai pakeitus proceso vaizdą, niekas negrąžinamas į iškvietimo funkciją, nes jį iškvietęs procesas nebeveikia. Bet jei bus kokia nors klaida -1 bus grąžinta. Jei įvyksta kokia nors klaida klaida yra nustatytas.

Sintaksėje:

  1. kelias naudojamas norint nurodyti visą vykdomo failo kelio pavadinimą.
  1. piktas ar argumentas priimtas. Tai iš tikrųjų yra failo, kuris bus vykdomas procese, pavadinimas. Dažniausiai arg ir path vertė yra ta pati.
  1. const char* arg funkcijose execl (), execlp () ir execle () laikomi arg0, arg1, arg2,…, argn. Iš esmės tai yra rodyklių į nulines nutrauktas eilutes sąrašas. Čia pirmasis argumentas nurodo failo pavadinimą, kuris bus vykdomas, kaip aprašyta 2 punkte.
  1. envp yra masyvas, kuriame yra rodyklių, nurodančių aplinkos kintamuosius.
  1. failą naudojamas nurodyti kelio pavadinimą, kuris identifikuos naujo proceso vaizdo failo kelią.
  1. „Exec“ funkcijos baigiasi Ir naudojami pakeisti naujo proceso vaizdo aplinką. Šios funkcijos praeina aplinkos nustatymų sąrašą naudodami argumentą envp . Šis argumentas yra simbolių masyvas, kuris nurodo į nulinę baigtinę eilutę ir apibrėžia aplinkos kintamąjį.

Norėdami naudoti „exec“ šeimos funkcijas, į savo C programą turite įtraukti šį antraštės failą:

#įtraukti

1 pavyzdys: „Exec“ sistemos skambučio naudojimas C programoje

Apsvarstykite šį pavyzdį, kuriame mes panaudojome „exec“ sistemos iškvietimą „C“ programavime „Linux“, „Ubuntu“: Čia yra du c failai example.c ir hello.c:

pavyzdys.c

KODAS:

#įtraukti
#įtraukti
#įtraukti
tarptpagrindinis(tarptargc, anglis *argv[])
{
printf ('PID pavyzdys.c = %d n',kvailas());
anglis *args[] = {'Sveiki', „C“, „Programavimas“,NULL};
vykd('./Sveiki',args);
printf („Grįžti į pavyzdį.c“);
grįžti 0;
}

sveiki.c

KODAS:

#įtraukti
#įtraukti
#įtraukti
tarptpagrindinis(tarptargc, anglis *argv[])
{
printf („Mes Sveiki. C n');
printf ('Sveiki, PID. C = %d n',kvailas());
grįžti 0;
}

IŠVADA:

PID pavyzdys.c = 4733
Mes Sveiki.c
Sveiki, PID. C = 4733

Pirmiau pateiktame pavyzdyje turime failą example.c ir hello.c. Pavyzdiniame .c faile pirmiausia išspausdinome dabartinio proceso ID (failas example.c veikia dabartiniame procese). Tada kitoje eilutėje sukūrėme simbolių rodyklių masyvą. Paskutinis šio masyvo elementas turėtų būti NULL kaip galutinis taškas.

Tada mes panaudojome funkciją execv (), kurios argumentas yra failo pavadinimas ir simbolių žymeklio masyvas. Čia reikia pažymėti, kad mes naudojome ./ su failo pavadinimu, jame nurodomas failo kelias. Kadangi failas yra aplanke, kuriame yra example.c, nereikia nurodyti viso kelio.

Kai iškviečiama „execv“ () funkcija, dabar mūsų proceso vaizdas bus pakeistas į failą example.c nėra įtrauktas į procesą, bet failas „hello.c“ yra procese. Galima pastebėti, kad proceso ID yra tas pats, ar hello.c yra proceso vaizdas ar pavyzdys. C yra proceso vaizdas, nes procesas yra tas pats ir proceso vaizdas tik pakeičiamas.

Tada turime atkreipti dėmesį į dar vieną dalyką, kuris yra printf () sakinys po to, kai execv () nėra vykdomas. Taip yra todėl, kad valdymas niekada negrąžinamas į seną proceso vaizdą, kai jį pakeičia naujas proceso vaizdas. Valdymas grįžta į skambinimo funkciją tik tada, kai nepavyksta pakeisti proceso vaizdo. (Grąžinimo vertė šiuo atveju yra -1).

Skirtumas tarp „fork“ () ir „exec“) sistemos skambučių:

Sistemos „fork“ () iškvietimas naudojamas kuriant tikslią vykdomo proceso kopiją, o sukurta kopija yra antrinis procesas, o vykdomasis procesas yra pirminis procesas. Tuo tarpu „exec“ () sistemos iškvietimas naudojamas pakeisti proceso vaizdą nauju proceso įvaizdžiu. Taigi vykdant () sistemos iškvietimą nėra tėvų ir vaikų procesų koncepcijos.

Fork () sistemos iškvietime tėvų ir antrinių procesai vykdomi tuo pačiu metu. Tačiau vykdant () sistemos iškvietimą, jei proceso vaizdo pakeitimas yra sėkmingas, valdiklis negrįžta ten, kur buvo iškviesta vykdymo funkcija, o vykdys naują procesą. Valdymas bus perkeltas atgal tik tuo atveju, jei bus kokia nors klaida.

2 pavyzdys: „Fork“ () ir „exec“ () sistemos skambučių derinimas

Apsvarstykite šį pavyzdį, kuriame toje pačioje programoje naudojome sistemos „fork“ () ir „exec“) iškvietimus:

pavyzdys.c

KODAS:

#įtraukti
#įtraukti
#įtraukti
tarptpagrindinis(tarptargc, anglis *argv[])
{
printf ('PID pavyzdys.c = %d n',kvailas());
pid_t p;
p=šakutė();
jei(p== -1)
{
printf („Skambinant šakute () įvyko klaida“);
}
jei(p==0)
{
printf („Mes dalyvaujame vaiko procese n');
printf („Skambinimas hello.c iš vaiko proceso n');
anglis *args[] = {'Sveiki', „C“, „Programavimas“,NULL};
vykd('./Sveiki',args);
}
Kitas
{
printf („Mes esame tėvų procese“);
}
grįžti 0;
}

sveiki.c:

KODAS:

#įtraukti
#įtraukti
#įtraukti
tarptpagrindinis(tarptargc, anglis *argv[])
{
printf („Mes Sveiki. C n');
printf ('Sveiki, PID. C = %d n',kvailas());
grįžti 0;
}

IŠVADA:

Pavyzdžio PID.c = 4790
Mes esame tėvų procese
Mes esame vaiko procese
Skambinimas hello.c iš vaiko proceso
Mes sveiki.c
Sveiki, PID. C = 4791

Šiame pavyzdyje mes panaudojome „fork“ () sistemos iškvietimą. Kai bus sukurtas antrinis procesas, 0 bus priskirtas p ir tada pereisime prie vaiko proceso. Dabar bus įvykdytas teiginių blokas su if (p == 0). Rodomas pranešimas ir mes panaudojome „execv“ () sistemos iškvietimą ir dabartinį antrinio proceso vaizdą, kuris yra example.c bus pakeistas „hello.c“. Prieš execv () skambutį vaiko ir tėvų procesai buvo vienodi.

Galima pastebėti, kad „example.c“ ir „hello.c“ PID dabar skiriasi. Taip yra todėl, kad pavyzdys.c yra pirminis proceso vaizdas, o sveiki. C - antrinio proceso vaizdas.