Linux Exec System Call

Linux Exec System Call



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

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







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



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



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





PID for prosessen endres ikke, men dataene, koden, stabelen, haugen osv. I prosessen endres og erstattes med de for nylig lastet prosess. Den nye prosessen utføres fra inngangspunktet.

Exec -systemanrop er en samling av funksjoner og i programmeringsspråk C er standardnavnene for disse funksjonene som følger:



  1. eksekl
  2. utføre
  3. execlp
  4. eksekv
  5. utføre
  6. execvp


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

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

de: l er for kommandolinjens argumenter sendt en liste til funksjonen

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

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

Hvorfor brukes eksekutiv?

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

Innerarbeid av eks

Vurder følgende punkter for å forstå hvordan exec fungerer:

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

Syntaxer for exec familiefunksjoner:

Følgende er syntakser 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 for disse funksjonene er Int. Når prosessbildet er vellykket erstattet, returneres ingenting til kallfunksjonen fordi prosessen som kalte det ikke lenger kjører. Men hvis det er noen feil -1 vil bli returnert. Hvis det oppstår en feil errno er satt.

I syntaksen:

  1. sti brukes til å spesifisere hele banenavnet til filen som skal kjøres.
  1. sint er argumentet passert. Det er faktisk navnet på filen som skal kjøres i prosessen. De fleste ganger er verdien av arg og bane den samme.
  1. const char* arg i funksjoner blir execl (), execlp () og execle () betraktet som arg0, arg1, arg2, ..., argn. Det er i utgangspunktet en liste over tips til null avslutte 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 skal identifisere banen til den nye prosessbildefilen.
  1. Funksjonene til exec call som slutter med Og brukes til å endre miljøet for det nye prosessbildet. Disse funksjonene passerer listen over miljøinnstillinger ved å bruke argumentet envp . Dette argumentet er en rekke tegn som peker på null -avsluttet streng og definerer miljøvariabel.

For å bruke exec -familiefunksjonene må du inkludere følgende toppfil i C -programmet:

#inkludere

Eksempel 1: Bruke exec systemanrop i C -program

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 hello.c:

eksempel. c

KODE:

#inkludere
#inkludere
#inkludere
inthoved-(intargc, røye *argv[])
{
printf ('PID for eksempel. C = %d n',bli lei());
røye *args[] = {'Hallo', 'C', 'Programmering',NULL};
eksekv('./Hallo',args);
printf ('Tilbake til eksempel.c');
komme tilbake 0;
}

Hei C

KODE:

#inkludere
#inkludere
#inkludere
inthoved-(intargc, røye *argv[])
{
printf ('Vi er i Hello.c n');
printf ('PID for hello.c = %d n',bli lei());
komme tilbake 0;
}

PRODUKSJON:

PID for eksempel. C = 4733
Vi er i Hello.c
PID for hello.c = 4733

I eksemplet ovenfor har vi en example.c -fil og hello.c -fil. I eksemplet .c -fil har vi først skrevet ut ID -en til den gjeldende prosessen (fileksempel.c kjører i gjeldende prosess). Så i neste linje har vi laget en rekke tegnpekere. Det siste elementet i denne matrisen skal være NULL som avslutningspunkt.

Deretter har vi brukt funksjonen execv () som tar filnavnet og tegnpekermatrisen som argument. Det bør bemerkes her at vi har brukt ./ med filnavnet, det angir banen til filen. Siden filen er i mappen der eksempel.c ligger, er det ikke nødvendig å spesifisere hele banen.

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

Så har vi en annen ting å merke seg her, som er utskriften printf () etter at execv () ikke er utført. Dette er fordi kontrollen aldri returneres til det gamle prosessbildet når et nytt prosessbilde erstatter det. Kontrollen kommer bare tilbake til kallfunksjonen når utskifting av prosessbilde ikke lykkes. (Returverdien er -1 i dette tilfellet).

Forskjellen mellom fork () og exec () systemanrop:

Fork () systemanropet brukes til å lage en eksakt kopi av en pågående prosess, og den opprettede kopien er underordnet prosess og kjøringsprosessen er den overordnede prosessen. Mens exec () systemanrop brukes til å erstatte et prosessbilde med et nytt prosessbilde. Derfor er det ikke noe begrep om foreldre- og barnprosesser i exec () systemanrop.

I fork () systemanrop utføres foreldre- og underordnede prosesser samtidig. Men i exec () systemanrop, hvis erstatningen av prosessbildet er vellykket, går ikke kontrollen tilbake til der exec -funksjonen ble kalt, men den vil utføre den nye prosessen. Kontrollen vil bare bli overført tilbake hvis det er noen feil.

Eksempel 2: Kombinere gaffel () og exec () systemanrop

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

eksempel. c

KODE:

#inkludere
#inkludere
#inkludere
inthoved-(intargc, røye *argv[])
{
printf ('PID for eksempel. C = %d n',bli lei());
pid_t s;
s=gaffel();
hvis(s== -1)
{
printf ('Det er en feil når du ringer til fork ()');
}
hvis(s==0)
{
printf ('Vi er i barneprosessen n');
printf ('Ringer hei. C fra barneprosess n');
røye *args[] = {'Hallo', 'C', 'Programmering',NULL};
eksekv('./Hallo',args);
}
ellers
{
printf ('Vi er i foreldreprosessen');
}
komme tilbake 0;
}

Hei C:

KODE:

#inkludere
#inkludere
#inkludere
inthoved-(intargc, røye *argv[])
{
printf ('Vi er i Hello.c n');
printf ('PID for hello.c = %d n',bli lei());
komme tilbake 0;
}

PRODUKSJON:

PID for eksempel. C = 4790
Vi er i foreldreprosessen
Vi er i barneprosess
Ringer hello.c fra barneprosess
Vi er i hallo. C
PID for hello.c = 4791

I dette eksemplet har vi brukt fork () systemanrop. Når barneprosessen er opprettet, blir 0 tildelt p, og deretter går vi til barneprosessen. Nå vil setningen med setninger med if (p == 0) bli utført. En melding vises, og vi har brukt execv () systemanrop og gjeldende underordnet prosessbilde som er eksempel. C blir erstattet med hello.c. Før execv () ringe var barn og foreldre prosesser de samme.

Det kan sees at PID for eksempel.c og hello.c er annerledes nå. Dette er fordi eksempel.c er det overordnede prosessbildet og hei. C er bildet for barnet prosess.