Sistemski pozivi

Linux Exec sistemski poziv

Linux Exec sistemski poziv

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

Točnije, možemo reći da će upotreba exec sistemskog poziva zamijeniti staru datoteku ili program iz procesa novom datotekom ili programom. Cjelokupni sadržaj postupka 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 se postupak samo pretvorio u novi proces i stoga se PID ID procesa ne mijenja, to je zato što ne stvaramo novi proces, već samo zamjenjujemo proces drugim procesom u izvršnom programu.

Ako trenutno pokrenut proces sadrži više niti, tada će se sve niti prekinuti, a nova slika procesa učitat će se i izvršiti. Ne postoje funkcije destruktora koje završavaju niti trenutnog procesa.

PID procesa se ne mijenja, ali podaci, kôd, hrpa, hrpa itd. procesa mijenjaju se i zamjenjuju onima iz novo učitanih procesa. Novi se postupak izvršava od ulazne točke.

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

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


Ovdje treba napomenuti da ove funkcije imaju istu bazu izvršiti nakon čega slijedi jedno ili više slova. Oni su objašnjeni u nastavku:

e: To je niz pokazivača koji upućuju na varijable okruženja i eksplicitno se prosljeđuju novo učitanom procesu.

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

p: p je varijabla okruženja puta koja pomaže pronaći datoteku prosljeđenu kao argument za učitavanje u proces.

v: v je za argumente naredbenog retka. Oni se prenose 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 izvrš

Razmotrite sljedeće točke da biste razumjeli rad execa:

  1. Trenutna slika procesa prepisuje se novom slikom procesa.
  2. Nova slika procesa je ona koju ste proslijedili kao exec argument
  3. Trenutno pokrenut postupak je završen
  4. Nova slika procesa ima isti ID procesa, isto okruženje i isti deskriptor datoteke (jer proces nije zamijenjen, slika procesa je zamijenjena)
  5. To utječe na status CPU i virtualnu memoriju. Mapiranje virtualne memorije trenutne slike procesa zamijenjeno je virtualnom memorijom nove slike procesa.

Sintakse funkcija obitelji exec:

Slijede sintakse za svaku funkciju exec:

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

Opis:

Tip povrata ovih funkcija je Int. Kada se slika procesa uspješno zamijeni, ništa se ne vraća funkciji pozivanja jer proces koji ju je pozvao više nije pokrenut. Ali ako postoji bilo kakva pogreška, vratit će se -1. Ako se dogodi bilo kakva pogreška, errno je postavljeno.

U sintaksi:

  1. staza koristi se za određivanje punog imena puta datoteke koja se treba izvršiti.
  1. arg je proslijeđeni argument. To je zapravo naziv datoteke koja će se izvršiti u procesu. Većina puta vrijednost arg i puta je ista.
  1. const char * arg u funkcijama execl (), execlp () i execle () smatra se arg0, arg1, arg2,…, argn. To je u osnovi popis uputa na nulirane 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 okoline.
  1. datoteka koristi se za određivanje naziva puta koji će identificirati put nove slikovne datoteke procesa.
  1. Funkcije exec poziva koje završavaju s e koriste se za promjenu okruženja za novu sliku procesa. Te funkcije prosljeđuju popis postavki okruženja pomoću argumenta envp. Ovaj argument je niz znakova koji upućuje na nulu završeni String i definira varijablu okruženja.

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

#include

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

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

primjer.c

KODIRATI:

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

printf ("PID primjera.c =% d \ n ", getpid ());
char * args [] = "Pozdrav", "C", "Programiranje", NULL;
execv ("./ zdravo ", argumenti);
printf ("Povratak na primjer.c ");
return 0;

zdravo.c

KODIRATI:

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

printf ("Nalazimo se u Hello.c \ n ");
printf ("PID zdravo.c =% d \ n ", getpid ());
return 0;

IZLAZ:

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

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

Tada smo koristili funkciju execv () koja za argument uzima ime datoteke i niz pokazivača znakova. Ovdje treba napomenuti da smo koristili ./ s nazivom datoteke, određuje put datoteke. Kako se datoteka nalazi u mapi u kojoj je primjer.c boravi pa nema potrebe za određivanjem pune staze.

Kada se pozove funkcija execv (), naša će slika procesa biti zamijenjena sada primjerom datoteke.c nije u procesu, ali datoteka zdravo.c je u procesu. Može se vidjeti da je ID procesa isti, bilo da je pozdrav.c je slika procesa ili primjer.c je slika procesa jer je postupak isti i slika procesa se samo zamjenjuje.

Tada ovdje moramo primijetiti još jednu stvar, a to je izjava printf () nakon što se execv () ne izvrši. To je zato što se kontrola više ne vraća natrag na staru sliku procesa kad je zamijeni nova slika procesa. Kontrola se vraća funkciji pozivanja samo kad je zamjena slike procesa neuspješna. (Povratna vrijednost je -1 u ovom slučaju).

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

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

U sistemskom pozivu fork () istodobno se izvršavaju nadređeni i podređeni procesi. Ali u sistemskom pozivu exec (), ako je zamjena slike procesa uspješna, kontrola se ne vraća tamo gdje je pozvana funkcija exec, već će izvršiti novi proces. Kontrola će se vratiti natrag samo ako postoji bilo kakva pogreška.

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

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

primjer.c

KODIRATI:

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

printf ("PID primjera.c =% d \ n ", getpid ());
pid_t p;
p = vilica ();
ako (p == - 1)

printf ("Došlo je do pogreške prilikom pozivanja fork ()");

ako (p == 0)

printf ("Mi smo u podređenom procesu \ n");
printf ("Poziv zdravo.c iz podređenog procesa \ n ");
char * args [] = "Pozdrav", "C", "Programiranje", NULL;
execv ("./ zdravo ", argumenti);

drugo

printf ("Mi smo u nadređenom procesu");

return 0;

zdravo.c:

KODIRATI:

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

printf ("Nalazimo se u Hello.c \ n ");
printf ("PID zdravo.c =% d \ n ", getpid ());
return 0;

IZLAZ:

PID primjera.c = 4790
Mi smo u roditeljskom procesu
Mi smo u procesu djeteta
Dozivam zdravo.c iz procesa djeteta
Zdravo smo.c
PID zdravo.c = 4791

U ovom smo primjeru koristili sistemski poziv fork (). Kada se stvori podređeni proces 0 će se dodijeliti p, a zatim ćemo prijeći na podređeni proces. Sada će se izvršiti blok naredbi s if (p == 0). Prikazuje se poruka i koristili smo sistemski poziv execv () i trenutnu podređenu sliku procesa, što je primjer.c će biti zamijenjen pozdravom.c. Prije execv () poziva podređeni i roditeljski procesi bili su isti.

Vidi se da je PID primjera.c i zdravo.c je sada drugačije. To je zato što primjer.c je slika roditeljskog procesa i zdravo.c je slika procesa djeteta.

Vodič za bitku za Wesnoth
Bitka za Wesnoth jedna je od najpopularnijih strateških igara otvorenog koda koje trenutno možete igrati. Ne samo da se ova igra razvija već jako dugo...
0 A.D. Vodič
Od mnogih strateških igara tamo, 0 A.D. uspijeva se istaknuti kao sveobuhvatan naslov i vrlo duboka, taktička igra unatoč tome što je otvoren izvor. R...
Vodič za Unity3D
Uvod u Unity 3D Unity 3D moćan je motor za razvoj igara. Cross platforma je to što vam omogućuje stvaranje igara za mobilne uređaje, web, stolne račun...