Linux Exec sistemski poziv

Linux Exec System Call

Sistemski poziv exec koristi se za izvršavanje datoteke koja se nalazi u aktivnom procesu. Kada se pozove exec, prethodna izvršna datoteka se zamjenjuje i nova datoteka se izvršava.

Točnije, možemo reći da će korištenje exec sistemskog poziva zamijeniti staru datoteku ili program iz procesa novom datotekom ili programom. Cjelokupni sadržaj procesa zamjenjuje se novim programom.



Segment korisničkih podataka koji izvršava sistemski poziv exec () zamjenjuje se podatkovnom datotekom čije je ime navedeno u argumentu tijekom pozivanja exec ().



Novi program učitava se u isti procesni prostor. Trenutni proces samo se pretvorio u novi proces, pa se stoga ID procesa PID ne mijenja, to je zato što ne stvaramo novi proces, već samo zamjenjujemo proces drugim procesom u exec -u.



Ako proces koji se trenutno izvodi sadrži više niti, sve niti će se prekinuti, a nova slika procesa učitati će se i izvršiti. Ne postoje funkcije destruktora koje prekidaju niti tekućeg procesa.

PID procesa se ne mijenja, ali se podaci, kôd, hrpa, hrpa itd. Procesa mijenjaju i zamjenjuju onima iz novo učitanog procesa. Novi proces izvodi se s ulazne točke.

Sistemski poziv Exec zbirka je funkcija i u programskom jeziku C standardni nazivi ovih funkcija su sljedeći:



  1. execl
  2. execle
  3. execlp
  4. execv
  5. izvršiti
  6. execvp


Ovdje treba napomenuti da ove funkcije imaju istu bazu exec nakon čega slijedi jedno ili više slova. To je objašnjeno u nastavku:

I: To je niz pokazivača koji upućuje na varijable okruženja i eksplicitno se prenosi u novo učitani proces.

: l je za argumente naredbenog retka koji su funkciji proslijedili popis

p: p je varijabla okruženja puta koja pomaže u pronalaženju datoteke proslijeđene kao argumenta za učitavanje u proces.

v: v je za argumente naredbenog retka. Oni se prosljeđuju kao niz pokazivača na funkciju.

Zašto se koristi exec?

exec se koristi kada korisnik želi pokrenuti novu datoteku ili program u istom procesu.

Unutarnji rad exec

Da biste razumjeli rad execa, uzmite u obzir sljedeće točke:

  1. Trenutna slika procesa prepisuje se novom slikom procesa.
  2. Nova slika procesa je ona koju ste proslijedili kao exec argument
  3. Trenutno pokrenuti proces je završen
  4. Nova slika procesa ima isti ID procesa, isto okruženje i isti opis datoteke (jer se proces ne zamjenjuje, slika procesa se zamjenjuje)
  5. To utječe na statistiku CPU -a i virtualnu memoriju. Mapiranje virtualne memorije trenutne slike procesa zamjenjuje se virtualnom memorijom nove slike procesa.

Sintaksa funkcija exec obitelji:

Slijede sintakse za svaku funkciju exec:

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

Opis:

Povratni tip ovih funkcija je Int. Kad se slika procesa uspješno zamijeni, ništa se ne vraća pozivajućoj funkciji jer proces koji ju je pozvao više ne radi. Ali ako postoji neka greška, -1 će se vratiti. Ako se dogodi neka greška an errno je postavljen.

U sintaksi:

  1. staza koristi se za navođenje punog naziva datoteke za izvršavanje.
  1. ljut je li argument prošao. To je zapravo naziv datoteke koja će se izvršiti u tom procesu. U većini slučajeva vrijednost arg i path su iste.
  1. const char* arg u funkcijama execl (), execlp () i execle () smatraju se arg0, arg1, arg2,…, argn. To je u osnovi popis pokazivača na null završene nizove. Ovdje prvi argument upućuje na naziv datoteke koji će se izvršiti kako je opisano u točki 2.
  1. envp je niz koji sadrži pokazivače koji upućuju na varijable okruženja.
  1. datoteka koristi se za navođenje naziva staze koja će identificirati put nove datoteke slike procesa.
  1. Funkcije exec pozivaju to s I koriste se za promjenu okruženja za novu sliku procesa. Ove funkcije prolaze popis postavki okruženja pomoću argumenta envp . Ovaj argument je niz znakova koji upućuje na niz s null završenim nizom i definira varijablu okruženja.

Da biste koristili obiteljske funkcije exec, morate uključiti sljedeću datoteku zaglavlja u svoj C program:

#uključi

Primjer 1: Korištenje exec sistemskog poziva u C programu

Razmotrimo sljedeći primjer u kojem smo koristili exec sistemski poziv u C programiranju u Linuxu, Ubuntu: Ovdje imamo dvije c datoteke example.c i hello.c:

primjer.c

KODIRATI:

#uključi
#uključi
#uključi
intglavni(intargc, char *argv[])
{
printf ('PID primjera.c = %d n',getpid());
char *args[] = {'Zdravo', 'C', 'Programiranje',NULL};
execv('./zdravo',args);
printf ('Natrag na primjer.c');
povratak 0;
}

pozdrav.c

KODIRATI:

#uključi
#uključi
#uključi
intglavni(intargc, char *argv[])
{
printf ('Nalazimo se u Hello.c n');
printf ('PID hello.c = %d n',getpid());
povratak 0;
}

IZLAZ:

PID primjera.c = 4733
Nalazimo se u Hello.c
PID hello.c = 4733

U gornjem primjeru imamo datoteku example.c i datoteku hello.c. U primjeru .c datoteke prije svega smo ispisali ID trenutnog procesa (datoteka example.c je pokrenuta u trenutnom procesu). Zatim smo u sljedećem retku stvorili niz pokazivača na znakove. Posljednji element ovog niza trebao bi biti NULL kao završna točka.

Zatim smo upotrijebili funkciju execv () koja za svoj argument uzima naziv datoteke i niz pokazivača znakova. Ovdje treba napomenuti da smo koristili ./ s imenom datoteke, on određuje put do datoteke. Kako se datoteka nalazi u mapi u kojoj se nalazi example.c, nema potrebe za navođenjem pune staze.

Kada se pozove funkcija execv (), naša slika procesa bit će zamijenjena sada datoteka example.c nije u procesu, ali datoteka hello.c je u procesu. Može se vidjeti da je ID procesa isti bez obzira na to je li hello.c slika procesa ili example.c je slika procesa jer je proces isti, a slika procesa samo se zamjenjuje.

Ovdje moramo primijetiti još jednu stvar, a to je iskaz printf () nakon što se execv () ne izvrši. To je zato što se kontrola nikada ne vraća na staru sliku procesa kada je zamijeni nova slika procesa. Kontrola se vraća na poziv funkcije samo ako zamjena slike procesa nije uspjela. (Povratna vrijednost je -1 u ovom slučaju).

Razlika između sistemskih poziva fork () i exec ():

Sistemski poziv fork () koristi se za stvaranje točne kopije pokrenutog procesa, a stvorena kopija je podređeni proces, a pokrenuti proces je nadređeni proces. Dok se sistemski poziv exec () koristi za zamjenu slike procesa novom slikom procesa. Stoga ne postoji koncept roditeljskog i podređenog procesa u sistemskom pozivu exec ().

U sistemskom pozivu fork () nadređeni i podređeni procesi izvode se istovremeno. Ali u sistemskom pozivu exec (), ako je zamjena slike procesa uspješna, kontrola se ne vraća na mjesto na kojem je pozvana funkcija exec, već će izvršiti novi proces. Upravljanje će se vratiti samo ako dođe do pogreške.

Primjer 2: Kombiniranje sistemskih poziva fork () i exec ()

Razmotrimo sljedeći primjer u kojem smo koristili sistemske pozive fork () i exec () u istom programu:

primjer.c

KODIRATI:

#uključi
#uključi
#uključi
intglavni(intargc, char *argv[])
{
printf ('PID primjera.c = %d n',getpid());
pid_t str;
str=vilica();
ako(str== -1)
{
printf ('Došlo je do pogreške pri pozivanju fork ()');
}
ako(str==0)
{
printf ('Mi smo u procesu djeteta n');
printf ('Pozivanje hello.c iz procesa djeteta n');
char *args[] = {'Zdravo', 'C', 'Programiranje',NULL};
execv('./zdravo',args);
}
drugo
{
printf ('U roditeljskom smo procesu');
}
povratak 0;
}

pozdrav.c:

KODIRATI:

#uključi
#uključi
#uključi
intglavni(intargc, char *argv[])
{
printf ('Nalazimo se u Hello.c n');
printf ('PID hello.c = %d n',getpid());
povratak 0;
}

IZLAZ:

PID primjera.c = 4790
U roditeljskom smo procesu
Mi smo u procesu djeteta
Pozivanje hello.c iz procesa djeteta
Mi smo u hello.c
PID hello.c = 4791

U ovom primjeru koristili smo sistemski poziv fork (). Kada se stvori podređeni proces 0 će se dodijeliti p, a zatim ćemo preći na podređeni proces. Sada će se izvršiti blok naredbi s if (p == 0). Prikazuje se poruka i upotrijebili smo sistemski poziv execv () i trenutnu sliku podređenog procesa koja je example.c zamijenit će hello.c. Prije execv () pozivanja podređeni i roditeljski procesi bili su isti.

Može se vidjeti da je PID za example.c i hello.c sada drugačiji. To je zato što je example.c slika roditeljskog procesa, a hello.c slika podređenog procesa.