Systémové volania

Systémové volanie systému Linux Exec

Systémové volanie systému Linux Exec

Systémové volanie exec sa používa na vykonanie súboru, ktorý sa nachádza v aktívnom procese. Keď sa volá exec, nahradí sa predchádzajúci spustiteľný súbor a vykoná sa nový súbor.

Presnejšie, môžeme povedať, že pomocou systémového volania exec sa starý súbor alebo program z procesu nahradí novým súborom alebo programom. Celý obsah procesu je nahradený novým programom.

Segment používateľských údajov, ktorý vykonáva systémové volanie exec (), sa nahradí dátovým súborom, ktorého názov je uvedený v argumente počas volania exec ().

Nový program sa načíta do rovnakého procesného priestoru. Aktuálny proces sa zmenil na nový proces, a preto sa ID procesu PID nezmení, je to preto, že nevytvárame nový proces, iba nahrádzame proces iným procesom v exec.

Ak aktuálne spustený proces obsahuje viac ako jedno vlákno, všetky vlákna sa ukončia, načíta sa nový obraz procesu a potom sa vykoná. Neexistujú žiadne funkcie deštruktora, ktoré ukončujú vlákna aktuálneho procesu.

PID procesu sa nemení, ale údaje, kód, zásobník, halda atď. procesu sa zmenia a nahradia sa procesmi novo zavedeného procesu. Nový proces sa vykonáva od vstupného bodu.

Systémové volanie Exec je kolekcia funkcií a v programovacom jazyku C sú štandardné názvy týchto funkcií tieto:

  1. okrem
  2. vykonať
  3. execlp
  4. vykon
  5. vykonať
  6. execvp


Tu je potrebné poznamenať, že tieto funkcie majú rovnaký základ vykon za ktorým nasleduje jedno alebo viac písmen. Ďalej sú vysvetlené:

e: Jedná sa o pole ukazovateľov, ktoré poukazujú na premenné prostredia a sú explicitne odovzdávané novo načítanému procesu.

l: l je pre argumenty príkazového riadku odovzdané funkcii zoznam

p: p je premenná prostredia cesty, ktorá pomáha nájsť súbor odovzdaný ako argument, ktorý sa má načítať do procesu.

v: v je pre argumenty príkazového riadku. Tieto sa odovzdávajú ako pole ukazovateľov na funkciu.

Prečo sa používa exec?

exec sa používa, keď chce užívateľ spustiť nový súbor alebo program v rovnakom procese.

Vnútorná práca vykon

Zvážte nasledujúce body, aby ste pochopili fungovanie programu exec:

  1. Aktuálny obraz procesu sa prepíše novým obrazom procesu.
  2. Nový obraz procesu je ten, ktorý ste odovzdali ako argument exec
  3. Aktuálne prebiehajúci proces je ukončený
  4. Nový obraz procesu má rovnaké ID procesu, rovnaké prostredie a rovnaký deskriptor súboru (pretože proces nie je nahradený, je nahradený obraz procesu)
  5. Je to ovplyvnené na CPU a virtuálnej pamäti. Mapovanie virtuálnej pamäte aktuálneho obrazu procesu je nahradené virtuálnou pamäťou nového obrazu procesu.

Syntaxe funkcií rodiny exec:

Nasledujú syntaxe pre každú funkciu príkazu exec:

int execl (const char * cesta, const char * arg, ...)
int execlp (const char * súbor, const char * arg, ...)
int execle (const char * cesta, const char * arg,…, char * const envp [])
int execv (const char * cesta, const char * argv [])
int execvp (const char * súbor, const char * argv [])
int execvpe (const char * súbor, const char * argv [], char * const envp [])

Popis:

Návratový typ týchto funkcií je Int. Po úspešnom nahradení obrazu procesu sa do volacej funkcie nevráti nič, pretože proces, ktorý ho vyvolal, už nie je spustený. Pokiaľ ale dôjde k chybe, vráti sa -1. Ak sa vyskytne chyba, errno je nastavený.

V syntaxi:

  1. cesta sa používa na zadanie úplnej cesty k súboru, ktorý sa má vykonať.
  1. arg je argument odovzdaný. Je to vlastne názov súboru, ktorý sa v procese spustí. Hodnota arg a cesty je väčšinou rovnaká.
  1. const char * arg vo funkciách execl (), execlp () a execle () sa považuje za arg0, arg1, arg2,…, argn. Je to v podstate zoznam ukazovateľov na null ukončené reťazce. Tu prvý argument smeruje na názov súboru, ktorý sa vykoná, ako je popísané v bode 2.
  1. envp je pole, ktoré obsahuje ukazovatele ukazujúce na premenné prostredia.
  1. spis sa používa na zadanie názvu cesty, ktorá bude určovať cestu nového obrazového súboru procesu.
  1. Funkcie exec volajú, ktoré končia e sa používajú na zmenu prostredia pre nový obraz procesu. Tieto funkcie odovzdávajú zoznam nastavení prostredia pomocou argumentu envp. Tento argument je pole znakov, ktoré poukazujú na reťazec s nulovým zakončením a definujú premennú prostredia.

Ak chcete používať funkcie rodiny exec, musíte do svojho programu C zahrnúť nasledujúci súbor hlavičky:

#include

Príklad 1: Použitie systémového volania exec v programe C

Uvažujme o nasledujúcom príklade, v ktorom sme použili programové volanie exec v programovaní C v systéme Linux, Ubuntu: Máme tu dva súbory c, napríklad.c a ahoj.c:

príklad.c

KÓD:

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

printf ("PID príkladu.c =% d \ n ", getpid ());
char * args [] = "Dobrý deň", "C", "Programovanie", NULL;
execv ("./ ahoj ", args);
printf ("Späť na príklad.c ");
návrat 0;

Ahoj.c

KÓD:

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

printf ("Sme v ahoj.c \ n ");
printf ("PID ahoj.c =% d \ n ", getpid ());
návrat 0;

VÝKON:

PID príkladu.c = 4733
Sme v Hello.c
PID ahoj.c = 4733

Vo vyššie uvedenom príklade máme príklad.c spis a ahoj.c súbor. V príklade .c súbor najskôr sme vytlačili ID aktuálneho procesu (príklad súboru.c beží v aktuálnom procese). Potom sme v ďalšom riadku vytvorili pole ukazovateľov znakov. Posledným prvkom tohto poľa by mal byť koncový bod NULL.

Potom sme použili funkciu execv (), ktorá ako argument vezme názov súboru a pole ukazovateľa znakov. Tu je potrebné poznamenať, že sme ich použili ./ s názvom súboru určuje cestu k súboru. Pretože je súbor v priečinku, kde je príklad.c býva, takže nie je potrebné špecifikovať celú cestu.

Keď sa volá funkcia execv (), náš obraz procesu sa teraz nahradí príkladom súboru.c nie je v procese, ale súbor ahoj.c je v procese. Je vidieť, že ID procesu je rovnaké, či ahoj.c je procesný obrázok alebo príklad.c je obraz procesu, pretože proces je rovnaký a obraz procesu sa iba nahradí.

Potom si tu musíme uvedomiť ďalšiu vec, ktorou je príkaz printf () po vykonaní príkazu execv (). Je to preto, že kontrola sa nikdy nevráti späť na starý obraz procesu, akonáhle ho nahradí nový obraz procesu. Ovládací prvok sa vráti k volacej funkcii, iba ak je výmena obrazu procesu neúspešná. (Návratová hodnota je v tomto prípade -1).

Rozdiel medzi systémovými volaniami fork () a exec ():

Systémové volanie fork () sa používa na vytvorenie presnej kópie bežiaceho procesu a vytvorená kópia je podradený proces a bežiaci proces je nadradený proces. Zatiaľ čo sa systémové volanie exec () používa na nahradenie obrazu procesu novým obrazom procesu. V systémovom volaní exec () teda neexistuje koncept procesov rodiča a dieťaťa.

V systémovom volaní fork () sa procesy rodiča a potomka vykonávajú súčasne. Ale v systémovom volaní exec (), ak je nahradenie obrazu procesu úspešné, sa kontrola nevráti tam, kde bola volaná funkcia exec, skôr vykoná nový proces. Ovládací prvok sa prenesie späť iba v prípade chyby.

Príklad 2: Kombinácia systémových volaní fork () a exec ()

Uvažujme o nasledujúcom príklade, v ktorom sme v rovnakom programe použili systémové volania fork () aj exec ():

príklad.c

KÓD:

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

printf ("PID príkladu.c =% d \ n ", getpid ());
pid_t p;
p = vidlica ();
ak (p == - 1)

printf ("Pri volaní fork ()" sa vyskytla chyba));

ak (p == 0)

printf ("Sme v podradenom procese \ n");
printf ("Volám ahoj.c z procesu dieťaťa \ n ");
char * args [] = "Dobrý deň", "C", "Programovanie", NULL;
execv ("./ ahoj ", args);

inak

printf ("Sme v nadradenom procese");

návrat 0;

Ahoj.c:

KÓD:

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

printf ("Sme v ahoj.c \ n ");
printf ("PID ahoj.c =% d \ n ", getpid ());
návrat 0;

VÝKON:

PID príkladu.c = 4790
Sme v rodičovskom procese
Sme v detskom procese
Volám ahoj.c z procesu dieťaťa
Sme ahoj.c
PID ahoj.c = 4791

V tomto príklade sme použili systémové volanie fork (). Keď sa vytvorí podradený proces, 0 sa priradí 0 a potom sa presunieme do podradeného procesu. Teraz sa vykoná blok výpisov s if (p == 0). Zobrazí sa správa a použili sme systémové volanie execv () a aktuálny podradený obraz procesu, ktorý je príkladom.c bude nahradené ahoj.c. Pred volaním execv () boli podradené a nadradené procesy rovnaké.

Je vidieť, že PID z príkladu.c a ahoj.c je teraz iné. Je to preto, že príklad.c je nadradený obraz procesu a ahoj.c je obraz procesu dieťaťa.

Hry 5 najlepších arkádových hier pre Linux
5 najlepších arkádových hier pre Linux
V dnešnej dobe sú počítače vážne stroje používané na hranie hier. Ak nemôžete dosiahnuť nové najvyššie skóre, budete vedieť, čo tým myslím. V tomto pr...
Hry Battle For Wesnoth 1.13.6 Vývoj uvoľnený
Battle For Wesnoth 1.13.6 Vývoj uvoľnený
Battle For Wesnoth 1.13.6 vydané minulý mesiac, je šiestym vývojovým vydaním v 1.13.séria x a prináša množstvo vylepšení, najmä používateľského rozhra...
Hry Ako nainštalovať League Of Legends na Ubuntu 14.04
Ako nainštalovať League Of Legends na Ubuntu 14.04
Ak ste fanúšikom League of Legends, potom je to pre vás príležitosť otestovať spustenie League of Legends. Upozorňujeme, že program PlayOnLinux podpor...