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:
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:
Syntaks av Exec -familiefunksjoner:
Følgende er syntaksene for hver funksjon av EXEC:
int execl (const char* path, const char* arg,…)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:
For å bruke Exec Family -funksjonene, må du ta med følgende overskriftsfil i C -programmet ditt:
#inkludereEksempel 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:
KODE:
#inkludereKODE:
#inkluderePRODUKSJON:
PID av eksempel.C = 4733I 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:
KODE:
#inkludereKODE:
#inkluderePRODUKSJON:
PID av eksempel.C = 4790I 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.