Sistemos skambučiai

„Linux Exec“ sistemos skambutis

„Linux Exec“ sistemos skambutis

„Exec“ sistemos iškvietimas naudojamas failui, gyvenančiam aktyviame procese, vykdyti. Kai vadinamas „exec“, ankstesnis vykdomasis failas pakeičiamas ir vykdomas naujas failas.

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

Vartotojo duomenų segmentas, vykdantis „exec“ () sistemos iškvietimą, pakeičiamas duomenų failu, kurio vardas pateiktas argumente, kai iškviečiama „exec“ ().

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

Jei šiuo metu vykstančiame procese yra daugiau nei viena gija, visos gijos bus nutrauktos, naujas proceso vaizdas bus įkeltas ir tada vykdomas. Nėra destruktoriaus funkcijų, kurios nutrauktų dabartinio proceso gijas.

Proceso PID nekeičiamas, tačiau duomenys, kodas, kaminas, kaupas ir kt. proceso yra keičiami ir pakeičiami naujai įkelto proceso. Naujas procesas vykdomas nuo įėjimo taško.

„Exec“ sistemos iškvietimas yra funkcijų rinkinys ir C programavimo kalba standartiniai šių funkcijų pavadinimai yra tokie:

  1. egzek
  2. įvykdyti
  3. execlp
  4. vykd
  5. vykdyti
  6. vykdymas


Čia reikia pažymėti, kad šios funkcijos turi tą patį pagrindą egzek po kurios eina viena ar kelios raidės. Tai paaiškinta toliau:

e: Tai yra rodyklių masyvas, kuris nurodo aplinkos kintamuosius ir yra aiškiai perduodamas naujai įkeltam procesui.

l: l yra komandinės eilutės argumentai perdavė funkcijai sąrašą

p: p yra kelio aplinkos kintamasis, kuris padeda rasti failą, perduotą kaip argumentą, kurį reikia įkelti į procesą.

v: v yra 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ą tuo pačiu procesu.

Vidinis exec darbas

Apsvarstykite šiuos dalykus, kad suprastumėte, kaip veikia „exec“:

  1. Dabartinis proceso vaizdas perrašomas nauju proceso vaizdu.
  2. Naujas proceso vaizdas yra tas, kurį perdavėte kaip „exec“ argumentą
  3. Šiuo metu vykdomas procesas baigtas
  4. Naujas proceso vaizdas turi tą patį proceso ID, tą pačią aplinką ir tą patį failo deskriptorių (nes procesas nepakeistas, proceso vaizdas pakeičiamas)
  5. Paveikiama procesoriaus statistika ir virtuali atmintis. Dabartinio proceso vaizdo virtualiosios 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. Kai proceso vaizdas sėkmingai pakeičiamas, niekas negrąžinamas į iškvietimo funkciją, nes procesas, kuris jį iškvietė, nebeveikia. Bet jei yra kokių nors klaidų, bus grąžinta -1. Jei įvyko klaida ir errno yra nustatytas.

Sintaksėje:

  1. kelias yra naudojamas nurodyti viso vykdomojo failo kelio pavadinimą.
  1. arg yra priimtas argumentas. Iš tikrųjų tai bus failo pavadinimas, kuris bus vykdomas procese. Dažniausiai arg ir path vertė yra vienoda.
  1. const char * arg funkcijose execl (), execlp () ir execle () laikomi arg0, arg1, arg2,…, argn. Iš esmės tai yra nuorodų į nulines baigtas eilutes sąrašas. Pirmasis argumentas nurodo failo pavadinimą, kuris bus vykdomas taip, kaip aprašyta 2 punkte.
  1. envp yra masyvas, kuriame yra nuorodos, nukreipiančios į aplinkos kintamuosius.
  1. failą naudojamas nurodyti kelio pavadinimą, kuris atpažins naujo proceso vaizdo failo kelią.
  1. „Exec“ funkcijos skambina tuo e naudojami norint pakeisti naujojo proceso vaizdo aplinką. Šios funkcijos perduoda aplinkos nustatymo sąrašą naudodamos argumentą envp. Šis argumentas yra simbolių masyvas, nurodantis nulinės pabaigos eilutę ir apibrėžiantis aplinkos kintamąjį.

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

# įtraukti

1 pavyzdys: „Exec“ sistemos iškvietimo naudojimas C programoje

Apsvarstykite šį pavyzdį, kuriame „exec“ sistemos iškvietimą naudojome „C“ programavimo sistemoje „Linux“, „Ubuntu“:.c ir labas.c:

pavyzdys.c

KODAS:

# įtraukti
# įtraukti
# įtraukti
int main (int argc, char * argv [])

printf ("pavyzdžio PID.c =% d \ n ", getpid ());
char * args [] = "Labas", "C", "Programavimas", NULL;
execv ("./ labas ", argumentuoja);
printf ("Atgal į pavyzdį.c ");
grąžinti 0;

Sveiki.c

KODAS:

# įtraukti
# įtraukti
# įtraukti
int main (int argc, char * argv [])

printf ("Mes sveiki.c \ n ");
printf ("Sveiki, PID.c =% d \ n ", getpid ());
grąžinti 0;

IŠĖJIMAS:

PID pavyzdys.c = 4733
Mes sveiki.c
Sveiki PID.c = 4733

Ankstesniame pavyzdyje mes turime pavyzdį.c failas ir labas.c failą. Pavyzdyje .c failą pirmiausia išspausdinome dabartinio proceso ID (failo pavyzdys.c veikia dabartiniame procese). Tada kitoje eilutėje mes sukūrėme simbolių rodyklių masyvą. Paskutinis šios masyvo elementas turėtų būti NULL kaip galutinis taškas.

Tada mes naudojome funkciją execv (), kurios argumentu laikomas failo pavadinimas ir simbolių rodyklių masyvas. Čia reikia pažymėti, kad mes naudojome ./ su failo pavadinimu nurodo failo kelią. Kadangi failas yra aplanke, kur pavyzdys.c gyvena, todėl nereikia nurodyti viso kelio.

Kai iškviečiama funkcija execv (), mūsų proceso vaizdas dabar bus pakeistas failo pavyzdžiu.c nėra procese, bet failas sveiki.c yra procese. Galima pastebėti, kad proceso ID yra tas pats, ar labas.c yra proceso vaizdas arba pavyzdys.c yra proceso vaizdas, nes procesas yra tas pats, o proceso vaizdas yra tik pakeistas.

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

„Fork“ () ir „exec“ () sistemos skambučių skirtumas:

„Fork“ () sistemos iškvietimas naudojamas norint sukurti tikslią vykstančio proceso kopiją, o sukurta kopija yra antrinis procesas, o vykdomasis procesas yra pagrindinis procesas. Tuo tarpu „exec“) sistemos iškvietimas naudojamas proceso vaizdui pakeisti nauju proceso vaizdu. Vadinasi, „exec“) sistemos iškvietime nėra tėvų ir vaikų procesų sampratos.

Šakės () sistemos iškvietime tėvų ir vaikų procesai vykdomi tuo pačiu metu. Tačiau vykdant „exec“) sistemos iškvietimą, jei proceso vaizdas pakeičiamas sėkmingai, valdiklis negrįžta ten, kur buvo vadinama „exec“ funkcija, o vykdys naują procesą. Valdiklis bus grąžintas atgal tik tuo atveju, jei yra kokių nors klaidų.

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

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

pavyzdys.c

KODAS:

# įtraukti
# įtraukti
# įtraukti
int main (int argc, char * argv [])

printf ("pavyzdžio PID.c =% d \ n ", getpid ());
pid_t p;
p = šakutė ();
jei (p == - 1)

printf ("Klaida skambinant šakute ()");

jei (p == 0)

printf ("Mes esame vaiko procese \ n");
printf ("Skambinu sveiki.c iš vaiko proceso \ n ");
char * args [] = "Labas", "C", "Programavimas", NULL;
execv ("./ labas ", argumentuoja);

Kitas

printf („Mes esame pirminiame procese“);

grąžinti 0;

Sveiki.c:

KODAS:

# įtraukti
# įtraukti
# įtraukti
int main (int argc, char * argv [])

printf ("Mes sveiki.c \ n ");
printf ("Sveiki, PID.c =% d \ n ", getpid ());
grąžinti 0;

IŠĖJIMAS:

PID pavyzdys.c = 4790
Mes esame tėvų procese
Mes esame vaiko procese
Skambinu labui.c iš vaiko proceso
Mes sveiki.c
Sveiki PID.c = 4791

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

Galima pastebėti, kad pavyzdžio PID.c ir labas.c dabar yra kitoks. Taip yra todėl, kad pavyzdys.c yra pirminis proceso vaizdas ir labas.c yra vaiko proceso vaizdas.

Valdykite ir valdykite pelės judėjimą tarp kelių „Windows 10“ monitorių
„Dual Display Mouse Manager“ leidžia jums valdyti ir konfigūruoti pelės judėjimą tarp kelių monitorių, sulėtinant jo judėjimą šalia sienos. „Windows 1...
„WinMouse“ leidžia tinkinti ir pagerinti pelės žymeklio judėjimą „Windows“ kompiuteryje
Jei norite pagerinti numatytąsias pelės žymiklio funkcijas, naudokite nemokamą programinę įrangą „WinMouse“. Tai prideda daugiau funkcijų, kurios padė...
Pelės kairiuoju pelės mygtuku mygtukas neveikia „Windows 10“
Jei naudojate specialią pelę su savo nešiojamuoju kompiuteriu arba staliniu kompiuteriu, tačiau neveikia pelės kairysis mygtukas dėl tam tikrų priežas...