exec (apel sistem) - exec (system call)

În calcul , exec este o funcționalitate a unui sistem de operare care rulează un fișier executabil în contextul unui proces deja existent , înlocuind executabilul anterior. Acest act este denumit și o suprapunere . Este deosebit de important în sistemele de tip Unix , deși există în altă parte. Deoarece nu se creează un proces nou, identificatorul de proces (PID) nu se modifică, dar codul mașinii , datele , heap- ul și stiva procesului sunt înlocuite cu cele ale noului program.

Exec Apelul este disponibil in mai multe limbaje de programare , inclusiv compilable limbi și unele limbaje de scripting . În interpreții de comandă OS , The exec încorporat comandă înlocuiește procesul de shell cu programul specificat.

Nomenclatură

Interfețe pentru exec și implementările sale variază. În funcție de limbajul de programare, acesta poate fi accesibil prin una sau mai multe funcții și, în funcție de sistemul de operare, poate fi reprezentat cu unul sau mai multe apeluri de sistem efective . Din acest motiv exec este uneori descris ca o colecție de funcții .

Numele standard ale acestor funcții în C sunt execl , execle , execlp , execv , execve și execvp (vezi mai jos ), dar nu „exec” în sine. Kernel - ul Linux are un apel sistem corespunzător numit „execve“, în timp ce toate funcțiile menționate mai sus sunt ambalaje de utilizator-spațiu în jurul acestuia.

Limbile de nivel superior oferă de obicei un apel numit exec .

Unix, POSIX și alte sisteme multitasking

Prototipuri de limbaj C

POSIX Standardul declară exec funcțiile în unistd.h fișierul antet, în limbajul C . Aceleași funcții sunt declarate în process.h pentru DOS (vezi mai jos ), OS / 2 și Microsoft Windows.

int execl(char const *path, char const *arg0, ...);
int execle(char const *path, char const *arg0, ..., char const *envp[]);
int execlp(char const *file, char const *arg0, ...);
int execv(char const *path, char const *argv[]);
int execve(char const *path, char const *argv[], char const *envp[]);
int execvp(char const *file, char const *argv[]);

Unele implementări oferă aceste funcții denumite cu o subliniere principală (de exemplu, _execl).

Baza fiecăruia este exec (execute), urmată de una sau mai multe litere:

e - O serie de indicatori către variabilele de mediu este transmisă în mod explicit noii imagini de proces.
l - Argumentele din linia de comandă sunt transmise individual (a l ist) funcției.
p - Folosește variabila de mediu PATH pentru a găsi fișierul numit în argumentul de fișier care urmează să fie executat.
v - Argumentele din linia de comandă sunt transmise funcției ca o matrice ( v ector) de pointeri.
cale

Argumentul specifică numele căii fișierului de executat ca nouă imagine de proces. Argumentele care încep de la arg0 sunt indicii către argumente care trebuie transmise noii imagini de proces. Valoarea argv este o serie de indicatori către argumente.

arg0

Primul argument arg0 ar trebui să fie numele fișierului executabil. De obicei, este aceeași valoare ca argumentul cale . Unele programe se pot baza greșit pe acest argument care oferă locația executabilului, dar nu există nicio garanție în acest sens și nici nu este standardizat pe platforme.

invp

Argument envp este o serie de indicatori pentru setările de mediu. Cele mai Exec apeluri cu numele se termină cu un e modifica mediul pentru noua imagine proces prin care trece o listă de setări de mediu prin intermediul envp argumentul. Acest argument este o serie de indicatori de caractere; fiecare element (cu excepția elementului final) indică un șir terminat nul care definește o variabilă de mediu .

Fiecare șir terminat nul are forma:

name=value

unde nume este numele variabilei de mediu, iar valoarea este valoarea acelei variabile. Elementul final al matricei envp trebuie să fie nul .

În apelurile execl , execlp , execv și execvp , noua imagine de proces moștenește variabilele de mediu curente.

Efecte

Un descriptor de fișier deschis când se efectuează un apel exec rămâne deschis în noua imagine de proces, cu excepția cazului în care a fost fcntl edat cu FD_CLOEXEC sau deschis cu O_CLOEXEC (acesta din urmă a fost introdus în POSIX.1-2001). Acest aspect este utilizat pentru a specifica fluxurile standard (stdin, stdout și stderr) ale noului program.

O suprapunere reușită distruge spațiul anterior de adrese de memorie al procesului și toate zonele sale de memorie, care nu au fost partajate , sunt recuperate de sistemul de operare. În consecință, toate datele sale care nu au fost transmise către noul program, sau salvate în alt mod, se pierd.

Valoare returnată

Un executant de succes înlocuiește imaginea procesului curent, deci nu poate returna nimic programului care a efectuat apelul. Procesele au o stare de ieșire , dar acea valoare este colectată de procesul părinte .

Dacă o funcție exec revine la programul apelant, apare o eroare, valoarea de returnare este -1 și errno este setat la una dintre următoarele valori:

Nume Note
E2BIG Lista argumentelor depășește limita sistemului.
EACCES Fișierul specificat are o încălcare a blocării sau partajării.
ENOENT Numele fișierului sau al căii nu a fost găsit.
ENOMEM Nu este disponibilă suficientă memorie pentru a executa noua imagine de proces.

Sisteme de operare DOS

DOS nu este un sistem de operare multitasking , dar înlocuirea imaginii executabile anterioare are un mare merit acolo datorită limitărilor dure ale memoriei primare și lipsei de memorie virtuală . Același API este utilizat pentru suprapunerea programelor în DOS și are efecte similare cu cele de pe sistemele POSIX.

Funcțiile de executare MS-DOS încarcă întotdeauna noul program în memorie ca și cum „alocarea maximă” din antetul fișierului executabil al programului este setat la valoarea implicită 0xFFFF. Utilitarul EXEHDR poate fi utilizat pentru a modifica câmpul de alocare maximă a unui program. Cu toate acestea, dacă se face acest lucru și programul este invocat cu una dintre funcțiile exec , programul se poate comporta diferit de un program invocat direct din linia de comandă a sistemului de operare sau cu una dintre funcțiile spawn (vezi mai jos ).

Interpreți de comandă

Multe shell-uri Unix oferă, de asemenea, o comandă exec integrată care înlocuiește procesul shell cu programul specificat. Scripturile Wrapper folosesc adesea această comandă pentru a rula un program (fie direct, fie printr-un interpret sau o mașină virtuală ) după setarea variabilelor de mediu sau a altei configurații. Prin utilizarea exec , resursele utilizate de programul shell nu trebuie să rămână în uz după ce programul este pornit.

Comanda exec poate efectua, de asemenea, o redirecționare . În unele shell-uri este chiar posibil să utilizați comanda exec doar pentru redirecționare, fără a face o suprapunere reală.

Alternative

Sistemul tradițional Unix nu are funcționalitatea de a crea un nou proces care rulează un nou program executabil într-un singur pas, ceea ce explică importanța executării pentru programarea Unix. Alte sisteme pot folosi spawn ca instrument principal pentru executarea executabilelor. Rezultatul său este echivalent cu secvența fork-exec a sistemelor de tip Unix. POSIX acceptă rutinele posix_spawn ca o extensie opțională care este de obicei implementată folosind vfork .

Alte sisteme

OS / 360 și succesorii includ un apel de sistem XCTL (control de transfer) care îndeplinește o funcție similară cu cea execut.

Vezi si

Referințe

  1. ^ a b "exec (3) - pagina manualului Linux" . man7.org . Adus 14-10-2016 .
  2. ^ „Shell Wrappers” . Proiect de documentare Linux . 10.03.2014 . Adus 1821-02-2021 .

linkuri externe