Linux Exec System Call

Linux Exec System Call
Exec -systemanropet brukes til å utføre en fil som er bosatt i en aktiv prosess. Når Exec kalles den forrige kjørbare filen, erstattes den nye filen og utføres.

Mer presist kan vi si at bruk av Exec System Call vil erstatte den gamle filen eller programmet fra prosessen med en ny fil eller program. Hele innholdet i prosessen erstattes med et nytt program.

Brukerdatasegmentet som utfører Exec () -systemanropet erstattes med datafilen hvis navn er gitt i argumentet mens du ringer Exec ().

Det nye programmet er lastet inn i samme prosessområde. Den nåværende prosessen blir nettopp omgjort til en ny prosess, og derfor er prosess -ID PID ikke endret, dette er fordi vi ikke lager en ny prosess vi bare erstatter en prosess med en annen prosess i EXE.

Hvis den for øyeblikket kjører prosessen inneholder mer enn en tråd, blir alle trådene avsluttet, og det nye prosessbildet blir lastet og deretter utført. Det er ingen destruktorfunksjoner som avslutter tråder av gjeldende prosess.

PID av prosessen endres ikke, men dataene, koden, stack, haug osv. av prosessen blir endret og erstattes med de med nybelastede prosess. Den nye prosessen utføres fra inngangspunktet.

EXEC System Call er en samling av funksjoner og på C -programmeringsspråk, standardnavnene for disse funksjonene er som følger:

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


Det skal bemerkes her at disse funksjonene har samme base Exec etterfulgt av en eller flere bokstaver. Disse blir forklart nedenfor:

e: Det er en rekke pekere som peker på miljøvariabler og sendes eksplisitt til den nybelastede prosessen.

l: l er for kommandolinjens argumenter som ble gitt en liste til funksjonen

p: P er banemiljøvariabelen som hjelper til med å finne filen som er gitt som et argument som skal lastes inn i prosessen.

v: v er for kommandolinjeargumentene. Disse sendes som en rekke pekere til funksjonen.

Hvorfor Exec brukes?

Exec brukes når brukeren ønsker å starte en ny fil eller program i samme prosess.

Indre arbeid av exec

Tenk på følgende punkter for å forstå arbeidet med Exec:

  1. Gjeldende prosessbilde blir overskrevet med et nytt prosessbilde.
  2. Nytt prosessbilde er det du passerte som EXEC -argument
  3. Den for øyeblikket løpende prosessen er avsluttet
  4. Nytt prosessbilde har samme prosess -ID, samme miljø og samme filbeskrivelse (fordi prosessen ikke erstattes prosessbilde erstattes)
  5. CPU -staten og det virtuelle minnet påvirkes. Virtuell minnekartlegging av det nåværende prosessbildet erstattes av virtuelt minne om nytt prosessbilde.

Syntaks av Exec -familiefunksjoner:

Følgende er syntaksene for hver funksjon av EXEC:

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

Beskrivelse:

Returtypen på disse funksjonene er int. Når prosessbildet erstattes med suksess, blir ingenting returnert til å ringe funksjon fordi prosessen som kalte det ikke lenger kjører. Men hvis det er noen feil -1 vil bli returnert. Hvis det oppstår noen feil errno er satt.

I syntaks:

  1. sti brukes til å spesifisere hele banenavnet på filen som skal utføres.
  1. Arg er argumentet bestått. Det er faktisk navnet på filen som vil bli utført i prosessen. De fleste gangene er verdien av Arg og Path den samme.
  1. const char* arg I funksjoner er execl (), execlp () og execle () betraktet som Arg0, Arg1, Arg2,…, Argn. Det er i utgangspunktet en liste over pekere til null avsluttet strenger. Her peker det første argumentet på filnavnet som vil bli utført som beskrevet i punkt 2.
  1. Envp er en matrise som inneholder pekere som peker på miljøvariablene.
  1. fil brukes til å spesifisere banenavnet som vil identifisere banen til den nye prosessbildefilen.
  1. Funksjonene til exec kaller den enden med e brukes til å endre miljøet for det nye prosessbildet. Disse funksjonene passerer listen over miljøinnstilling ved å bruke argumentet Envp. Dette argumentet er en rekke tegn som peker på null avsluttet streng og definerer miljøvariabel.

For å bruke Exec Family -funksjonene, må du ta med følgende overskriftsfil i C -programmet ditt:

#inkludere

Eksempel 1: Bruke Exec System Call i C -programmet

Tenk på følgende eksempel der vi har brukt exec -systemanrop i C -programmering i Linux, Ubuntu: Vi har to C -filer her eksempel.C og hei.c:

eksempel.c

KODE:

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

printf ("PID av eksempel.c = %d \ n ", getPid ());
char *args [] = "hallo", "c", "programmering", null;
execv ("./hei ", args);
printf ("Tilbake til eksempel.c ");
retur 0;

Hallo.c

KODE:

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

printf ("Vi er i hei.c \ n ");
printf ("PID of Hello.c = %d \ n ", getPid ());
retur 0;

PRODUKSJON:

PID av eksempel.C = 4733
Vi er i Hello.c
PID av hei.C = 4733

I eksemplet ovenfor har vi et eksempel.C -fil og hei.C -fil. I eksemplet .C -filen først av alt vi har skrevet ut IDen til den gjeldende prosessen (fileksempel.C kjører i gjeldende prosess). Så i neste linje har vi laget en rekke karakterpekere. Det siste elementet i denne matrisen skal være null som avsluttende punktet.

Så har vi brukt funksjonen Execv () som tar filnavnet og karakterpekeroppstillingen som argument. Det skal bemerkes her vi har brukt ./ Med navnet på filen spesifiserer den banen til filen. Som filen er i mappen der eksempel.C er bosatt, så det er ikke nødvendig å spesifisere hele banen.

Når execv () -funksjonen kalles, vil prosessbildet vårt bli erstattet nå Fileksemplet.C er ikke i prosessen, men filen hei.C er i prosessen. Det kan sees at prosess -IDen er den samme om hei.C er prosessbilde eller eksempel.C er prosessbilde fordi prosessen er det samme og prosessbildet bare erstattes.

Så har vi en annen ting å merke seg her som er PRINTF () -uttalelsen etter at execv () ikke er utført. Dette er fordi kontrollen aldri blir returnert tilbake til gammelt prosessbilde når nytt prosessbilde erstatter det. Kontrollen kommer bare tilbake til å ringe funksjonen når du erstatter prosessbildet er mislykket. (Returverdien er -1 i dette tilfellet).

Forskjell mellom gaffel () og exec () systemanrop:

Fork () systemanrop brukes til å lage en eksakt kopi av en løpsprosess, og den opprettede kopien er barneprosessen, og løpsprosessen er overordnet prosess. Mens exec () systemanrop brukes til å erstatte et prosessbilde med et nytt prosessbilde. Derfor er det ikke noe begrep om foreldre- og barneprosesser i exec () systemanrop.

I gaffel () System Ring foreldrene og barneprosessene utføres samtidig. Men i Exec () Systemanrop, hvis erstatning av prosessbildet er vellykket, går ikke kontrollen tilbake til der EXEC -funksjonen ble kalt snarere, vil utføre den nye prosessen. Kontrollen vil bare bli overført tilbake hvis det er noen feil.

Eksempel 2: Kombinasjonsgaffel () og exec () systemanrop

Tenk på følgende eksempel der vi har brukt både gaffel () og exec () systemanrop i samme program:

eksempel.c

KODE:

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

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

printf ("Det er en feil mens du ringer gaffel ()");

if (p == 0)

printf ("Vi er i barneprosessen \ n");
printf ("Ringer hei.c fra barneprosess \ n ");
char *args [] = "hallo", "c", "programmering", null;
execv ("./hei ", args);

ellers

printf ("Vi er i overordnet prosess");

retur 0;

Hallo.c:

KODE:

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

printf ("Vi er i hei.c \ n ");
printf ("PID of Hello.c = %d \ n ", getPid ());
retur 0;

PRODUKSJON:

PID av eksempel.C = 4790
Vi er i foreldreprosess
Vi er i barneprosess
Ringer hei.C fra barneprosess
Vi er i Hello.c
PID av hei.C = 4791

I dette eksemplet har vi brukt gaffel () systemanrop. Når barneprosessen opprettes 0 vil bli tildelt P og deretter flytter vi til barneprosessen. Nå blir uttalelsesblokken med IF (p == 0) utført. En melding vises, og vi har brukt execv () systemanrop og det nåværende barneprosessbildet som er eksempel.C vil erstattes med hei.c. Før execv () ring barne- og overordnede prosesser var de samme.

Det kan sees at eksemplet.C og hei.C er annerledes nå. Dette er fordi eksempel.C er foreldreprosessbildet og hei.C er barneprosessbildet.