Systémové volanie Linux Exec

Linux Exec System Call



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

Presnejšie môžeme povedať, že pomocou systémového volania exec nahradí starý súbor alebo program z procesu 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 meno je uvedené v argumente pri volaní exec ().



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



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





PID procesu sa nezmení, ale údaje, kód, zásobník, halda atď. Procesu sa zmenia a nahradia sa údajmi novo načítaného procesu. Nový proces sa vykoná zo vstupného bodu.

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



  1. popraviť
  2. popraviť
  3. execlp
  4. vykon
  5. popraviť
  6. execvp


Tu je potrebné poznamenať, že tieto funkcie majú rovnaký základ exekútor za ktorým nasleduje jedno alebo viac písmen. Tieto sú vysvetlené nižšie:

A: Je to pole ukazovateľov, ktoré ukazujú na premenné prostredia a je explicitne odoslané do novo načítaného procesu.

: l je pre argumenty príkazového riadka, ktorým funkcia odovzdala 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 riadka. Tieto sa odovzdávajú ako pole ukazovateľov na funkciu.

Prečo sa používa exec?

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

Vnútorná práca výkon

Aby ste pochopili fungovanie exec, vezmite do úvahy nasledujúce body:

  1. Aktuálny obraz procesu sa prepíše novým obrazom procesu.
  2. Nový obraz procesu je ten, ktorý ste zadali ako argument exec
  3. Aktuálne spustený 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ý, obraz procesu je nahradený)
  5. Ovplyvní to stav CPU a virtuálnu pamäť. Mapovanie virtuálnej pamäte aktuálneho obrazu procesu je nahradené virtuálnou pamäťou nového obrazu procesu.

Syntax funkcií rodiny exec:

Nasledujú syntaxe pre každú funkciu exec:

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

Popis:

Návratový typ týchto funkcií je Int. Keď je obraz procesu úspešne nahradený, volajúcej funkcii sa nič nevráti, pretože proces, ktorý ho volal, už nebeží. Ale ak dôjde k chybe, vráti sa -1. Ak sa vyskytne nejaká chyba, errno je nastavený.

V syntaxi:

  1. cesta sa používa na zadanie úplného názvu cesty k súboru, ktorý sa má vykonať.
  1. nahnevaný je argument prijatý? Je to vlastne názov súboru, ktorý sa v tomto procese spustí. Hodnota arg a cesta sú 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 nulové ukončené reťazce. Prvý argument tu ukazuje na názov súboru, ktorý sa vykoná podľa popisu v bode 2.
  1. envp je pole, ktoré obsahuje ukazovatele smerujúce na premenné prostredia.
  1. súbor sa používa na zadanie názvu cesty, ktorá bude identifikovať cestu nového súboru s obrazom procesu.
  1. Funkcie exec call, ktoré končia na A 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é odkazuje na reťazec s nulovým ukončením a definuje premennú prostredia.

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

#zahrnúť

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

Zoberme si nasledujúci príklad, v ktorom sme použili systémové volanie exec v programovaní C v Linuxe, Ubuntu: Máme tu dva súbory c example.c a hello.c:

príklad.c

KÓD:

#zahrnúť
#zahrnúť
#zahrnúť
intHlavná(intargc, char *argv[])
{
printf ('PID príkladu.c = %d n',dostať sa());
char *args[] = {'Ahoj', 'C', 'Programovanie',NULOVÝ};
vykon('./Ahoj',args);
printf („Späť na example.c“);
vrátiť sa 0;
}

ahoj.c

KÓD:

#zahrnúť
#zahrnúť
#zahrnúť
intHlavná(intargc, char *argv[])
{
printf ('Sme v Hello.c n');
printf ('PID ahoj.c = %d n',dostať sa());
vrátiť sa 0;
}

VÝKON:

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

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

Potom sme použili funkciu execv (), ktorá ako argument berie názov súboru a pole ukazovateľa znakov. Tu je potrebné poznamenať, že sme použili ./ s názvom súboru, ktorý určuje cestu k súboru. Keďže je súbor v priečinku, kde je umiestnený súbor example.c, nie je potrebné zadávať úplnú cestu.

Keď sa zavolá funkcia execv (), náš obrázok procesu bude teraz nahradený súborom example.c sa nepracuje, ale prebieha súbor hello.c. Je zrejmé, že ID procesu je rovnaké, či už hello.c je obrázok procesu alebo example.c je obraz procesu, pretože proces je rovnaký a obraz procesu je iba nahradený.

Potom tu musíme poznamenať ďalšiu vec, ktorou je príkaz printf () po tom, ako sa execv () nevykonal. Dôvodom je, že kontrola sa nikdy nevráti späť na starý obraz procesu, keď ho nahradí nový obrázok procesu. Ovládací prvok sa vráti k volacej funkcii iba vtedy, ak je nahradenie obrazu procesu neúspešné. (Návratová hodnota je v tomto prípade -1).

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

Systémové volanie fork () sa používa na vytvorenie presnej kópie spusteného procesu a vytvorená kópia je podradeným procesom a spustený proces je nadradeným procesom. Zatiaľ čo systémové volanie exec () sa používa na nahradenie obrazu procesu novým obrazom procesu. Preto v systémovom volaní exec () neexistuje žiadny koncept nadradeného a podradeného procesu.

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

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

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

príklad.c

KÓD:

#zahrnúť
#zahrnúť
#zahrnúť
intHlavná(intargc, char *argv[])
{
printf ('PID príkladu.c = %d n',dostať sa());
pid_t p;
p=vidlička();
keby(p== -1)
{
printf („Pri volaní fork () sa vyskytla chyba);
}
keby(p==0)
{
printf („Sme v procese dieťaťa n');
printf ('Volá sa hello.c z podradeného procesu n');
char *args[] = {'Ahoj', 'C', 'Programovanie',NULOVÝ};
vykon('./Ahoj',args);
}
inak
{
printf („Sme v rodičovskom procese“);
}
vrátiť sa 0;
}

ahoj.c:

KÓD:

#zahrnúť
#zahrnúť
#zahrnúť
intHlavná(intargc, char *argv[])
{
printf ('Sme v Hello.c n');
printf ('PID ahoj.c = %d n',dostať sa());
vrátiť sa 0;
}

VÝKON:

PID príkladu.c = 4790
Sme v rodičovskom procese
Sme v detskom procese
Volá sa hello.c z podradeného procesu
Sme v ahoj.c
PID ahoj.c = 4791

V tomto prípade sme použili systémové volanie fork (). Keď je vytvorený podriadený proces, 0 bude priradené k p a potom sa presunieme do podradeného procesu. Teraz bude vykonaný blok príkazov s if (p == 0). Zobrazí sa správa a použili sme systémové volanie execv () a aktuálny obraz podradeného procesu, ktorý je example.c, bude nahradený hello.c. Pred volaním execv () boli podradené a rodičovské procesy rovnaké.

Je vidieť, že PID príkladov.c a ahoj.c je teraz iný. Dôvodom je, že example.c je nadradený obraz procesu a hello.c je podriadený obraz procesu.