Systemopkald

Linux Exec-systemopkald

Linux Exec-systemopkald

Exec-systemopkaldet bruges til at udføre en fil, der ligger i en aktiv proces. Når exec kaldes, erstattes den tidligere eksekverbare fil, og den nye fil udføres.

Mere præcist kan vi sige, at brug af exec-systemopkald erstatter den gamle fil eller det gamle program fra processen med en ny fil eller et nyt program. Hele indholdet af processen erstattes med et nyt program.

Brugerdatasegmentet, der udfører systemopkaldet exec (), erstattes med datafilen, hvis navn er angivet i argumentet, mens der kaldes på exec ().

Det nye program indlæses i det samme procesrum. Den nuværende proces er bare omdannet til en ny proces, og derfor ændres proces-id'et PID ikke, det er fordi vi ikke opretter en ny proces, vi erstatter bare en proces med en anden proces i exec.

Hvis den aktuelt kørende proces indeholder mere end en tråd, afsluttes alle tråde, og det nye procesbillede indlæses og derefter udføres. Der er ingen destruktorfunktioner, der afslutter tråde i den aktuelle proces.

PID for processen ændres ikke, men data, kode, stack, heap osv. af processen ændres og erstattes med dem for den nyindlæste proces. Den nye proces udføres fra startpunktet.

Exec-systemopkald er en samling af funktioner, og i programmeringssprog C er standardnavne for disse funktioner som følger:

  1. execl
  2. udføre
  3. execlp
  4. execv
  5. udføre
  6. execvp


Det skal bemærkes her, at disse funktioner har samme base udføre efterfulgt af et eller flere bogstaver. Disse forklares nedenfor:

e: Det er en række markører, der peger på miljøvariabler og overføres eksplicit til den nyindlæste proces.

l: l er for kommandolinjeargumenterne sendt en liste til funktionen

p: p er sti-miljøvariablen, der hjælper med at finde den fil, der er sendt som et argument, der skal indlæses i processen.

v: v er til kommandolinjeargumenterne. Disse sendes som en række markører til funktionen.

Hvorfor exec bruges?

exec bruges, når brugeren ønsker at starte en ny fil eller et nyt program i samme proces.

Indre arbejde af exec

Overvej følgende punkter for at forstå funktionen af ​​exec:

  1. Nuværende procesbillede overskrives med et nyt procesbillede.
  2. Nyt procesbillede er det, du har sendt som exec-argument
  3. Den aktuelt kørende proces er afsluttet
  4. Nyt procesbillede har samme proces-id, samme miljø og samme filbeskrivelse (fordi proces ikke erstattes procesbillede erstattes)
  5. CPU-stat og virtuel hukommelse påvirkes. Kortlægning af virtuel hukommelse af det aktuelle procesbillede erstattes af virtuel hukommelse for nyt procesbillede.

Syntakser af exec-familiefunktioner:

Følgende er syntaksen for hver funktion af exec:

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

Beskrivelse:

Returtypen for disse funktioner er Int. Når procesbilledet er udskiftet med succes, returneres intet til opkaldsfunktionen, fordi den proces, der kaldte det, ikke længere kører. Men hvis der er nogen fejl -1, returneres. Hvis der opstår en fejl, skal en errno er indstillet.

I syntaksen:

  1. sti bruges til at specificere det fulde stinavn for den fil, der skal udføres.
  1. arg er argumentet bestået. Det er faktisk navnet på filen, der vil blive udført i processen. De fleste gange er værdien af ​​arg og sti den samme.
  1. con char * arg i funktioner betragtes execl (), execlp () og execle () som arg0, arg1, arg2,…, argn. Det er dybest set en liste med henvisninger til nulstillede strenge. Her peger det første argument på filnavnet, der udføres som beskrevet i punkt 2.
  1. envp er en matrix, der indeholder markører, der peger på miljøvariablerne.
  1. fil bruges til at specificere stienavnet, som identificerer stien til den nye procesbilledfil.
  1. Funktionerne i exec-opkald, der slutter med e bruges til at ændre miljøet til det nye procesbillede. Disse funktioner videregiver listen over miljøindstillinger ved hjælp af argumentet envp. Dette argument er en række tegn, der peger på nultermineret streng og definerer miljøvariabel.

For at bruge exec-familiefunktionerne skal du medtage følgende headerfil i dit C-program:

#omfatte

Eksempel 1: Brug af exec-systemopkald i C-program

Overvej følgende eksempel, hvor vi har brugt exec-systemopkald i C-programmering i Linux, Ubuntu: Vi har to c-filer her eksempel.c og hej.c:

eksempel.c

KODE:

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

printf ("eksempel PID.c =% d \ n ", getpid ());
char * args [] = "Hej", "C", "Programmering", NULL;
execv ("./ hej ", args);
printf ("Tilbage til eksempel.c ");
returnere 0;

Hej.c

KODE:

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

printf ("Vi er i Hello.c \ n ");
printf ("Hej PID.c =% d \ n ", getpid ());
returnere 0;

PRODUKTION:

PID for eksempel.c = 4733
Vi er i Hello.c
PID af hej.c = 4733

I ovenstående eksempel har vi et eksempel.c-fil og hej.c-fil. I eksemplet .c-fil først og fremmest har vi udskrevet ID'et for den aktuelle proces (fileksempel.c kører i den aktuelle proces). Derefter i den næste linje har vi oprettet en række tegnmarkører. Det sidste element i denne matrix skal være NULL som afslutningspunkt.

Derefter har vi brugt funktionen execv (), der tager filnavnet og tegnmarkørarrayet som argument. Det skal bemærkes her, at vi har brugt ./ med filnavnet angiver det stien til filen. Da filen er i mappen hvor eksempel.c bor, så der er ikke behov for at specificere den fulde sti.

Når execv () -funktion kaldes, erstattes vores procesbillede nu fileksemplet.c er ikke i processen, men filen hej.c er i processen. Det kan ses, at proces-id'et er det samme om det er hej.c er procesbillede eller eksempel.c er procesbillede, fordi processen er den samme, og procesbillede erstattes kun.

Så har vi en anden ting at bemærke her, som er printf () -erklæringen efter execv () ikke udføres. Dette skyldes, at kontrol aldrig returneres til det gamle procesbillede, når det nye procesbillede erstatter det. Kontrollen vender kun tilbage til opkaldsfunktionen, når udskiftning af procesbillede ikke lykkes. (Returneringsværdien er -1 i dette tilfælde).

Forskel mellem fork () og exec () systemopkald:

Fork () systemopkald bruges til at oprette en nøjagtig kopi af en kørende proces, og den oprettede kopi er underprocessen, og kørende processen er den overordnede proces. Mens exec () systemopkald bruges til at erstatte et procesbillede med et nyt procesbillede. Derfor er der intet begreb om forældre- og barneprocesser i exec () systemopkald.

I fork () systemopkald udføres forældre- og underordnede processer på samme tid. Men i exec () systemopkald, hvis udskiftningen af ​​procesbillede er vellykket, vender kontrollen ikke tilbage til det sted, hvor exec-funktionen blev kaldt, men den udfører den nye proces. Kontrollen overføres kun tilbage, hvis der er nogen fejl.

Eksempel 2: Kombination af gaffel () og exec () systemopkald

Overvej følgende eksempel, hvor vi har brugt både fork () og exec () systemopkald i det samme program:

eksempel.c

KODE:

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

printf ("eksempel PID.c =% d \ n ", getpid ());
pid_t p;
p = gaffel ();
hvis (p == - 1)

printf ("Der er en fejl under opkald til fork ()");

hvis (p == 0)

printf ("Vi er i barneprocessen \ n");
printf ("Ringer hej.c fra underordnet proces \ n ");
char * args [] = "Hej", "C", "Programmering", NULL;
execv ("./ hej ", args);

andet

printf ("Vi er i den overordnede proces");

returnere 0;

Hej.c:

KODE:

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

printf ("Vi er i Hello.c \ n ");
printf ("Hej PID.c =% d \ n ", getpid ());
returnere 0;

PRODUKTION:

PID for eksempel.c = 4790
Vi er i forældreprocessen
Vi er i børneproces
Ringer hej.c fra barnets proces
Vi er hej.c
PID af hej.c = 4791

I dette eksempel har vi brugt fork () systemopkald. Når barneprocessen oprettes, tildeles 0 til p, og derefter flytter vi til barneprocessen. Nu eksekveres blokken af ​​udsagn med if (p == 0). Der vises en meddelelse, og vi har brugt execv () systemopkald og det aktuelle underordnede procesbillede, som er eksempel.c erstattes med hej.c. Før execv () var barnets og forældrenes processer de samme.

Det kan ses, at PID for eksempel.c og hej.c er anderledes nu. Dette er fordi eksempel.c er det overordnede procesbillede og hej.c er barnets procesbillede.

Mus Styr og administrer musebevægelse mellem flere skærme i Windows 10
Styr og administrer musebevægelse mellem flere skærme i Windows 10
Dual Display Mouse Manager lader dig kontrollere og konfigurere musebevægelse mellem flere skærme ved at bremse dens bevægelser nær grænsen. Windows 1...
Mus WinMouse giver dig mulighed for at tilpasse og forbedre musemarkørens bevægelse på Windows-pc
WinMouse giver dig mulighed for at tilpasse og forbedre musemarkørens bevægelse på Windows-pc
Hvis du vil forbedre standardfunktionerne for din musemarkør, skal du bruge freeware WinMouse. Det tilføjer flere funktioner, der hjælper dig med at f...
Mus Museklik på venstre museknap fungerer ikke på Windows 10
Museklik på venstre museknap fungerer ikke på Windows 10
Hvis du bruger en dedikeret mus med din bærbare computer eller stationære computer, men musens venstre-klik-knap fungerer ikke på Windows 10/8/7 af en...