Sistemski klici

Sistemski klic Linux Exec

Sistemski klic Linux Exec

Sistemski klic exec se uporablja za izvajanje datoteke, ki je v aktivnem procesu. Ko pokličete exec, se prejšnja izvršljiva datoteka nadomesti in izvede nova datoteka.

Natančneje, lahko rečemo, da bo uporaba sistemskega klica exec staro datoteko ali program iz postopka nadomestila z novo datoteko ali programom. Celotna vsebina postopka se nadomesti z novim programom.

Uporabniški podatkovni segment, ki izvaja sistemski klic exec (), se med klicanjem exec () nadomesti z podatkovno datoteko, katere ime je navedeno v argumentu.

Novi program se naloži v isti procesni prostor. Trenutni postopek je pravkar spremenjen v nov postopek, zato se ID PID procesa ne spremeni, ker ne ustvarjamo novega procesa, ampak samo nadomeščamo postopek z drugim postopkom v exec.

Če postopek, ki se trenutno izvaja, vsebuje več kot eno nit, bodo vse niti zaključene in nova slika procesa bo naložena in nato izvedena. Ni destruktorskih funkcij, ki zaključujejo niti trenutnega procesa.

PID procesa se ne spremeni, ampak podatki, koda, sklad, kup itd. postopka se spremenijo in nadomestijo s tistimi na novo naložen proces. Nov postopek se izvede od vstopne točke.

Sistemski klic Exec je zbirka funkcij in v programskem jeziku C so standardna imena teh funkcij naslednja:

  1. izv
  2. execle
  3. execlp
  4. execv
  5. execve
  6. execvp


Tu je treba opozoriti, da imajo te funkcije enako osnovo izvrš čemur sledi ena ali več črk. Ti so pojasnjeni spodaj:

e: To je vrsta kazalcev, ki kažejo na spremenljivke okolja in se izrecno posredujejo novo naloženemu procesu.

l: l je za argumente ukazne vrstice, ki so funkciji poslali seznam

p: p je spremenljivka okolja poti, ki pomaga najti datoteko, posredovano kot argument, ki se naloži v proces.

v: v je za argumente ukazne vrstice. Ti se posredujejo funkciji kot niz kazalcev.

Zakaj se uporablja exec?

exec se uporablja, kadar želi uporabnik v istem postopku zagnati novo datoteko ali program.

Notranje delovanje izvrš

Upoštevajte naslednje točke, da boste razumeli delovanje exec:

  1. Trenutna slika procesa se prepiše z novo sliko procesa.
  2. Nova slika procesa je tista, ki ste jo poslali kot argument exec
  3. Trenutno se izvaja postopek se je končal
  4. Nova slika procesa ima enak ID procesa, isto okolje in isti deskriptor datoteke (ker proces ni zamenjan, slika procesa je zamenjana)
  5. To vpliva na statistiko CPE in navidezni pomnilnik. Preslikava navideznega pomnilnika trenutne slike procesa se nadomesti z navideznim pomnilnikom nove slike procesa.

Sintakse funkcij družine exec:

Spodaj so sintakse za vsako funkcijo exec:

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

Opis:

Vrnjeni tip teh funkcij je Int. Ko je slika procesa uspešno zamenjana, se nič ne vrne klicni funkciji, ker se postopek, ki jo je poklical, ne izvaja več. Če pa pride do napake, se vrne -1. Če pride do kakršne koli napake, errno je nastavljeno.

V sintaksi:

  1. pot se uporablja za določitev celotnega imena poti datoteke, ki jo je treba izvršiti.
  1. arg je podani argument. Pravzaprav je ime datoteke, ki se bo v tem postopku izvedla. Največkrat je vrednost arg in poti enaka.
  1. const char * arg v funkcijah execl (), execlp () in execle () se šteje kot arg0, arg1, arg2,…, argn. V bistvu gre za seznam kazalcev na ničelno zaključene nize. Tu prvi argument kaže na ime datoteke, ki se bo izvedlo, kot je opisano v točki 2.
  1. envp je matrika, ki vsebuje kazalce, ki kažejo na spremenljivke okolja.
  1. mapa se uporablja za določitev imena poti, ki bo opredelilo pot nove slikovne datoteke procesa.
  1. Funkcije klica exec, ki se končajo z e se uporabljajo za spreminjanje okolja za novo sliko procesa. Te funkcije posredujejo seznam nastavitev okolja z uporabo argumenta envp. Ta argument je niz znakov, ki kaže na niz, ki se konča z ničem, in definira spremenljivko okolja.

Če želite uporabljati funkcije družine exec, morate v svoj program C vključiti naslednjo datoteko z glavo:

#include

Primer 1: Uporaba sistemskega klica exec v programu C

Razmislite o naslednjem primeru, v katerem smo uporabili sistemski klic exec pri programiranju C v Linuxu, Ubuntu: Tu imamo dve datoteki c.c in živjo.c:

primer.c

KODA:

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

printf ("PID primera.c =% d \ n ", getpid ());
char * args [] = "Pozdravljeni", "C", "Programiranje", NULL;
execv ("./ zdravo ", argumenti);
printf ("Nazaj na primer.c ");
vrnitev 0;

zdravo.c

KODA:

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

printf ("Pozdravljeni smo.c \ n ");
printf ("PID pozdrav.c =% d \ n ", getpid ());
vrnitev 0;

IZHOD:

PID primera.c = 4733
Smo v Pozdravljeni.c
PID zdravo.c = 4733

V zgornjem primeru imamo primer.c datoteko in zdravo.c datoteko. V primeru .c datoteko najprej smo natisnili ID trenutnega procesa (primer datoteke.c teče v trenutnem procesu). Nato smo v naslednji vrstici ustvarili vrsto kazalcev na znake. Zadnji element te matrike mora biti NULL kot zaključna točka.

Nato smo uporabili funkcijo execv (), ki za argument vzame ime datoteke in polje kazalca znakov. Tu je treba opozoriti, da smo uporabili ./ z imenom datoteke določa pot datoteke. Ker je datoteka v mapi, kjer je primer.c prebiva, zato ni treba določiti celotne poti.

Ko pokličete funkcijo execv (), bo naša slika procesa nadomeščena zdaj kot primer datoteke.c ni v postopku, ampak datoteka zdravo.c je v postopku. Vidimo lahko, da je ID procesa enak, ne glede na to, ali pozdravljen.c je slika ali primer procesa.c je slika procesa, ker je postopek enak in je slika procesa samo zamenjana.

Potem imamo tu še eno stvar, ki jo moramo opozoriti, to je stavek printf (), potem ko se execv () ne izvrši. To je zato, ker se nadzor nikoli ne vrne nazaj na staro sliko procesa, ko jo zamenja nova slika procesa. Kontrolnik se vrne na funkcijo klica šele, ko je zamenjava slike procesa neuspešna. (V tem primeru je vrnjena vrednost -1).

Razlika med sistemskimi klici fork () in exec ():

Sistemski klic fork () se uporablja za ustvarjanje natančne kopije tekočega procesa, ustvarjena kopija pa je podrejeni proces, zaženi postopek pa nadrejeni proces. Sistemski klic exec () pa se uporablja za nadomestitev slike procesa z novo sliko procesa. Zato v sistemskem klicu exec () ni koncepta nadrejenih in podrejenih procesov.

V sistemskem klicu fork () se hkrati izvajata nadrejeni in podrejeni proces. Toda v sistemskem klicu exec (), če je zamenjava slike procesa uspešna, se kontrolnik ne vrne tja, kjer je bila klicana funkcija exec, temveč bo izvedel nov postopek. Nadzor se bo prenesel nazaj le, če pride do napake.

Primer 2: Združevanje sistemskih klicev fork () in exec ()

Razmislite o naslednjem primeru, v katerem smo v istem programu uporabili sistemske klice fork () in exec ():

primer.c

KODA:

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

printf ("PID primera.c =% d \ n ", getpid ());
pid_t p;
p = vilice ();
če (p == - 1)

printf ("Napaka med klicem fork ()");

če (p == 0)

printf ("Smo v podrejenem procesu \ n");
printf ("Pokliči zdravo.c iz podrejenega procesa \ n ");
char * args [] = "Pozdravljeni", "C", "Programiranje", NULL;
execv ("./ zdravo ", argumenti);

drugače

printf ("Smo v nadrejenem postopku");

vrnitev 0;

zdravo.c:

KODA:

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

printf ("Pozdravljeni smo.c \ n ");
printf ("PID pozdrav.c =% d \ n ", getpid ());
vrnitev 0;

IZHOD:

PID primera.c = 4790
Smo v postopku staršev
Smo v otroškem procesu
Kličem zdravo.c iz otroškega procesa
Pozdravljeni smo.c
PID zdravo.c = 4791

V tem primeru smo uporabili sistemski klic fork (). Ko se ustvari podrejeni postopek, se 0 dodeli p, nato pa se premaknemo na podrejeni postopek. Zdaj se izvede blok stavkov z if (p == 0). Prikaže se sporočilo in uporabili smo sistemski klic execv () in trenutno podrejeno sliko procesa, ki je primer.c bo zamenjal z zdravo.c. Pred klicem execv () sta bila nadrejena in nadrejena procesa enaka.

Vidi se, da je PID primera.c in živjo.c je zdaj drugače. To je zato, ker primer.c je slika starševskega procesa in zdravo.c je podrejena slika procesa.

Kako prikazati števec FPS v igrah Linux
Linux gaming je dobil velik zagon, ko je Valve leta 2012 napovedal podporo Linuxu za odjemalca Steam in njihove igre. Od takrat se je veliko AAA in in...
Kako prenesti in igrati Sid Meier's Civilization VI v Linuxu
Uvod v igro Civilization 6 je sodoben pogled na klasični koncept, uveden v seriji iger Age of Empires. Ideja je bila dokaj preprosta; začeli bi v zelo...
Kako namestiti in igrati Doom v Linuxu
Uvod v Doom Serija Doom je nastala v devetdesetih letih po izidu prvotnega Dooma. Bil je takojšen hit in od takrat naprej je serija iger prejela števi...