Systeemoproepen

Linux Exec-systeemaanroep

Linux Exec-systeemaanroep

De exec-systeemaanroep wordt gebruikt om een ​​bestand uit te voeren dat zich in een actief proces bevindt. Wanneer exec wordt aangeroepen, wordt het vorige uitvoerbare bestand vervangen en wordt het nieuwe bestand uitgevoerd.

Meer precies, we kunnen zeggen dat het gebruik van exec-systeemaanroep het oude bestand of programma uit het proces zal vervangen door een nieuw bestand of programma. De volledige inhoud van het proces wordt vervangen door een nieuw programma.

Het gebruikersgegevenssegment dat de systeemaanroep exec() uitvoert, wordt vervangen door het gegevensbestand waarvan de naam in het argument wordt gegeven tijdens het aanroepen van exec().

Het nieuwe programma wordt in dezelfde procesruimte geladen. Het huidige proces is gewoon veranderd in een nieuw proces en daarom is de proces-ID PID niet gewijzigd, dit komt omdat we geen nieuw proces maken, we vervangen gewoon een proces door een ander proces in exec.

Als het huidige lopende proces meer dan één thread bevat, worden alle threads beëindigd en wordt de nieuwe procesafbeelding geladen en vervolgens uitgevoerd. Er zijn geen destructorfuncties die threads van het huidige proces beëindigen.

PID van het proces wordt niet gewijzigd, maar de gegevens, code, stapel, heap, enz. van het proces worden gewijzigd en vervangen door die van het nieuw geladen proces. Het nieuwe proces wordt uitgevoerd vanaf het ingangspunt.

Exec-systeemaanroep is een verzameling functies en in de programmeertaal C zijn de standaardnamen voor deze functies als volgt:

  1. execl
  2. voorbeeld
  3. execlp
  4. execv
  5. uitvoerend
  6. execvp


Hierbij moet worden opgemerkt dat deze functies dezelfde basis hebben uitvoerend gevolgd door een of meer letters. Deze worden hieronder toegelicht:

e: Het is een reeks aanwijzers die naar omgevingsvariabelen verwijst en expliciet wordt doorgegeven aan het nieuw geladen proces.

ik: l is voor de opdrachtregelargumenten die een lijst aan de functie hebben doorgegeven

p: p is de padomgevingsvariabele die helpt bij het vinden van het bestand dat is doorgegeven als argument om in het proces te worden geladen.

v: v is voor de opdrachtregelargumenten. Deze worden doorgegeven als een array van verwijzingen naar de functie.

Waarom exec wordt gebruikt?

exec wordt gebruikt wanneer de gebruiker een nieuw bestand of programma in hetzelfde proces wil starten.

Innerlijke werking van exec

Overweeg de volgende punten om de werking van exec te begrijpen:

  1. Huidige procesafbeelding wordt overschreven met een nieuwe procesafbeelding.
  2. Nieuwe procesafbeelding is degene die u hebt doorgegeven als exec-argument
  3. Het huidige lopende proces is beëindigd
  4. Nieuwe procesafbeelding heeft dezelfde proces-ID, dezelfde omgeving en dezelfde bestandsdescriptor (omdat proces niet wordt vervangen procesafbeelding wordt vervangen)
  5. De CPU-statistieken en het virtuele geheugen worden beïnvloed. Virtuele geheugentoewijzing van de huidige procesafbeelding wordt vervangen door virtueel geheugen van nieuwe procesafbeelding.

Syntaxis van exec-familiefuncties:

Hieronder volgen de syntaxis voor elke functie van exec:

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

Omschrijving:

Het retourtype van deze functies is Int. Wanneer de procesafbeelding met succes is vervangen, wordt er niets teruggegeven aan de aanroepende functie omdat het proces dat deze heeft aangeroepen niet langer actief is. Maar als er een fout is, wordt -1 geretourneerd. Als er een fout is opgetreden, foutje is ingesteld.

In de syntaxis:

  1. pad wordt gebruikt om de volledige padnaam op te geven van het bestand dat moet worden uitgevoerd.
  1. arg is het argument doorgegeven?. Het is eigenlijk de naam van het bestand dat tijdens het proces wordt uitgevoerd. Meestal is de waarde van arg en pad hetzelfde.
  1. const char* arg in functies execl(), execlp() en execle() wordt beschouwd als arg0, arg1, arg2,… ​​, argn. Het is in feite een lijst met verwijzingen naar null-beëindigde strings. Hier wijst het eerste argument naar de bestandsnaam die zal worden uitgevoerd zoals beschreven in punt 2.
  1. envp is een array die pointers bevat die verwijzen naar de omgevingsvariabelen.
  1. het dossier wordt gebruikt om de padnaam op te geven die het pad van het nieuwe procesafbeeldingsbestand zal identificeren.
  1. De functies van exec noemen die eindigen op e worden gebruikt om de omgeving voor de nieuwe procesafbeelding te wijzigen. Deze functies geven een lijst met omgevingsinstellingen door met behulp van het argument envp. Dit argument is een array van tekens die verwijst naar een null-beëindigde String en de omgevingsvariabele definieert.

Om de exec-familiefuncties te gebruiken, moet u het volgende headerbestand in uw C-programma opnemen:

#include

Voorbeeld 1: Exec-systeemaanroep gebruiken in C-programma

Beschouw het volgende voorbeeld waarin we exec-systeemaanroep hebben gebruikt in C-programmering in Linux, Ubuntu: We hebben hier twee c-bestanden voorbeeld.c en hallo.c:

voorbeeld.c

CODE:

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

printf("PID van voorbeeld.c = %d\n", getpid());
char *args[] = "Hallo", "C", "Programmeren", NULL;
execv("./hallo", argumenten);
printf("Terug naar voorbeeld.c");
retourneer 0;

Hallo.c

CODE:

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

printf("We zijn in Hallo.c\n");
printf("PID van hallo.c = %d\n", getpid());
retourneer 0;

UITGANG:

PID van voorbeeld.c = 4733
We zijn in Hallo.c
PID van hallo.c = 4733

In het bovenstaande voorbeeld hebben we een voorbeeld:.c bestand en hallo.c bestand. In het voorbeeld .c-bestand eerst hebben we de ID van het huidige proces afgedrukt (bestandsvoorbeeld.c wordt uitgevoerd in het huidige proces). Vervolgens hebben we in de volgende regel een reeks tekenaanwijzers gemaakt. Het laatste element van deze array moet NULL zijn als het eindpunt.

Vervolgens hebben we de functie execv() gebruikt die de bestandsnaam en de tekenaanwijzerarray als argument heeft. Hier moet worden opgemerkt dat we hebben gebruikt ./ met de naam van het bestand, specificeert het het pad van het bestand. Omdat het bestand zich in de map bevindt waar voorbeeld.c zich bevindt, dus het is niet nodig om het volledige pad op te geven.

Wanneer de functie execv() wordt aangeroepen, wordt onze procesafbeelding nu vervangen door het bestandsvoorbeeld.c is niet in het proces, maar het bestand hallo.c is in de maak. Het is te zien dat de proces-ID hetzelfde is, of hallo.c is procesafbeelding of voorbeeld.c is procesafbeelding omdat proces hetzelfde is en procesafbeelding alleen wordt vervangen.

Dan hebben we nog iets om op te merken, namelijk de printf()-instructie nadat execv() niet is uitgevoerd. Dit komt omdat de besturing nooit teruggaat naar de oude procesafbeelding zodra deze wordt vervangen door een nieuwe procesafbeelding. De besturing keert alleen terug naar de oproepfunctie wanneer het vervangen van de procesafbeelding niet succesvol is. (De retourwaarde is in dit geval -1).

Verschil tussen fork() en exec() systeemaanroepen:

De systeemaanroep fork() wordt gebruikt om een ​​exacte kopie van een lopend proces te maken en de gemaakte kopie is het onderliggende proces en het lopende proces is het bovenliggende proces. Terwijl de systeemaanroep exec() wordt gebruikt om een ​​procesafbeelding te vervangen door een nieuwe procesafbeelding. Daarom is er geen concept van bovenliggende en onderliggende processen in exec() systeemaanroep.

In fork() systeemaanroep worden de bovenliggende en onderliggende processen tegelijkertijd uitgevoerd. Maar in exec() systeemaanroep, als de vervanging van de procesafbeelding succesvol is, keert het besturingselement niet terug naar waar de exec-functie werd aangeroepen, maar voert het het nieuwe proces uit. De besturing wordt alleen terug overgedragen als er een fout is.

Voorbeeld 2: Fork() en exec() systeemaanroepen combineren

Beschouw het volgende voorbeeld waarin we zowel fork() als exec() systeemaanroepen in hetzelfde programma hebben gebruikt:

voorbeeld.c

CODE:

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

printf("PID van voorbeeld.c = %d\n", getpid());
pid_t p;
p = vork();
als(p==-1)

printf("Er is een fout opgetreden bij het aanroepen van fork()");

als(p==0)

printf("We zitten in het onderliggende proces\n");
printf("Hallo bellen.c van onderliggend proces\n");
char *args[] = "Hallo", "C", "Programmeren", NULL;
execv("./hallo", argumenten);

anders

printf("We bevinden ons in het bovenliggende proces");

retourneer 0;

Hallo.c:

CODE:

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

printf("We zijn in Hallo.c\n");
printf("PID van hallo.c = %d\n", getpid());
retourneer 0;

UITGANG:

PID van voorbeeld.c = 4790
We zitten in het ouderproces
We zitten in het kinderproces
hallo bellen.c uit kindproces
We zijn in hallo.c
PID van hallo.c = 4791

In dit voorbeeld hebben we fork() systeemaanroep. Wanneer het onderliggende proces is gemaakt, wordt 0 toegewezen aan p en gaan we naar het onderliggende proces. Nu wordt het blok met instructies met if(p==0) uitgevoerd. Er wordt een bericht weergegeven en we hebben de systeemaanroep execv() gebruikt en de afbeelding van het huidige onderliggende proces, dat een voorbeeld is.c wordt vervangen door hallo.c. Vóór execv() waren de onderliggende en bovenliggende processen hetzelfde.

Het kan worden gezien dat de PID van voorbeeld.c en hallo.c is nu anders. Dit komt omdat voorbeeld.c is de afbeelding van het bovenliggende proces en hallo.c is de afbeelding van het onderliggende proces.

Met WinMouse kunt u de beweging van de muisaanwijzer op Windows-pc aanpassen en verbeteren
Als u de standaardfuncties van uw muisaanwijzer wilt verbeteren, gebruik dan freeware WinMuis. Het voegt meer functies toe om u te helpen het meeste u...
Linkermuisknop werkt niet op Windows 10
Als u een speciale muis gebruikt met uw laptop of desktopcomputer, maar de linkermuisknop werkt niet not op Windows 10/8/7 om wat voor reden dan ook, ...
Cursor springt of beweegt willekeurig tijdens het typen in Windows 10
Als u merkt dat uw muiscursor vanzelf springt of beweegt, automatisch, willekeurig tijdens het typen op een Windows-laptop of -computer, dan kunnen en...