EXECV -funksjon på C -språk

EXECV -funksjon på C -språk

Det er flere måter og funksjoner for å starte prosessene fra et program. Hver av dem tilbyr forskjellige løsninger på programmereren, avhengig av behovene i det aktuelle tilfellet.

De execxx () Familie er et sett med systemfunksjoner som er definert i “Unistd.H ”header for å kjøre en prosess fra et program. Denne funksjonsfamilien lar oss sende inngangsargumentene til den kjørbare som kaller det, og det er derfor det er en veldig nyttig ressurs for samhandling mellom prosesser.

I dette Linux hint artikkel, du lærer alt om execv () funksjon på C -språket. Vi vil se på syntaks, den teoretiske beskrivelsen av hvordan den fungerer, inngangs- og utgangsargumentene og hvilken type data som hver av dem behandler. Du lærer også hvordan du oppretter og bruker matriser av strenger og pekere som er en del av inngangsargumentene til denne funksjonsfamilien og sendes til anropsprosessen.

Deretter bruker vi det vi lærte i et praktisk eksempel som viser riktig implementering og kall av execv () funksjon.

Syntaks av Execv () -funksjonen på C -språk

int execv (const char *path, char *const argv []);

Beskrivelse av Execv () -funksjonen på C -språk

De execv () Funksjon utfører en prosess fra en annen prosess eller program. Denne funksjonen utfører filen eller den kjørbare som er spesifisert i *sti argument. Denne oppføringen skal inneholde den absolutte eller relative banen til den kjørbare filen i strengformat.

De *Argv [] Argument er en rekke pekere til strenger der hver streng er et inngangsargument som sendes til prosessen som skal utføres. Den første pekeren til matrisen skal alltid peke på en streng som inneholder navnet på den kjørbare filen, og den siste pekeren skal alltid være null. Når execv () kalles, prosessen den ble kalt omsettes, skrevet om og erstattet av den nye prosessen i den tildelte delen av minnet og med samme ID.

Hvis funksjonen utføres vellykket, kommer den ikke tilbake. Hvis den kommer tilbake, er det fordi det oppstår en feil. Feilene som denne funksjonen kan generere er varierte, alt fra den ikke-eksisterende kjørbare filstien til nektet tillatelser.

Feilen kan identifiseres ved å hente verdien fra errno Global variabel. På den senere delen vil vi se en spesiell seksjon som forklarer de vanligste feilene i denne funksjonen og deres identifikasjon.

Familien av execxx () Funksjoner er definert i “Unistd.h ”header. For å bruke dem, må vi inkludere dem i ".c ”-fil som følger:

#inkludere

Hvordan du utfører en prosess fra et program ved hjelp av execv () -funksjonen på C -språket

I dette eksemplet vil vi forklare hvordan du bruker execv () Funksjon for å utføre en prosess og sende inndataargumentene fra et program til et annet.

For å gjøre dette, lager vi to veldig enkle koder. Den ene er overordnet prosess som kaller EXECV () -funksjonen for å utføre barneprosessen. Når execv () Funksjonen starter barneprosessen, den passerer den med tre inngangsargumenter i form av en streng som barnetrosessen henter og viser på skallet.

Barneprosess

Barneprosessen er et enkelt stykke kode som skriver ut “Jeg er barneprosessen ” Melding, henter inngangsargumentene som sendes av overordnede prosessen, og viser dem på skallet. Her er koden for barneprosessen:

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

printf ("Jeg er barneprosessen");
printf ("Argument 1: %s \ n", argv [1]);
printf ("Argument 2: %s \ n", argv [2]);
printf ("Argument 3: %s \ n", argv [3]);


Vi sammenstiller denne koden og lagrer produksjonen i "dokumenter" under "barn" -navnet med ".Bin ”-forlengelse som vist i følgende:

~ $ GCC -dokumenter/barn.C -o Dokumenter/barn.søppelkasse


På denne måten lagrer vi den kjørbare filen for barn i "Dokumenter". Veien til denne kjørbare er inngangsargumentet, sti, Når du ringer execv () I foreldreprosessen.


Foreldreprosess

Foreldreprosessen er den vi kaller execv () funksjon for å utføre barneprosessen. I denne koden definerer vi en rekke pekere til strengene som representerer inngangsargumentene til prosessen som execv () Funksjonen åpnes.

Du kan se hvordan du kan lage en rekke pekere til strenger i følgende illustrasjon. I dette tilfellet består den av 5 pekere og kalles arg_ptr [].

char *arg_ptr [5];


Når en rekke pekere er definert, må hver peker tildeles en streng som inneholder inngangsargumentet som vi sender til barneprosessen.

Du kan se hvordan du skal tilordne hver peker med det tilsvarende argumentet i strengformat i følgende illustrasjon:

arg_ptr [0] = "barn.c ";
arg_ptr [1] = "\ nhello fra";
arg_ptr [2] = "prosess 2";
arg_ptr [3] = null;


En annen måte å tilordne strengene til pekerarrayen er å omslutte strengene i krøllete seler og skille dem med komma:

arg_ptr [] = "barn.c, "\ nhello fra", "prosess 2", null;


Etter å ha definert en rekke pekere til hvert argument, er neste trinn å ringe execv () funksjon, passere strengen som inneholder den absolutte eller relative banen til den kjørbare filen som det første argumentet og rekke strengene arg_ptr []Som det andre argumentet.

Du kan se den komplette "hoved" av overordnede prosessen i følgende illustrasjon:

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
int main ()
printf ("\ n \ ni er overordnet prosess \ n");
char *arg_ptr [5];
arg_ptr [0] = "barn.c ";
arg_ptr [1] = "\ nhello fra";
arg_ptr [2] = "prosess 2";
arg_ptr [3] = null;
Execv ("/Home/Linuxhint/Child.bin ", arg_ptr);


Vi kompilerer denne koden som spesifiserer banen til ".c ”-fil og navnet på ut.

~ $ GCC -dokumenter/foreldre.C -o mønster


Deretter kjører vi utgangen.

~ $ ./ mønster


Foreldreprosessen viser “Jeg er foreldreprosessen” melding, oppretter strenggruppen ved å tilordne en streng for hvert inngangsargument som sendes til neste prosess, og kaller execv () funksjon. Hvis execv () Funksjonen utføres vellykket, barnet.BIN kjørbar erstatter overordnet prosess og overtar ID og tildelte minne, slik at denne handlingen kan ikke angres.

Barneprosessen viser “Jeg er barneprosessen” Melding og henter hvert av inngangsargumentene som sendes av overordnede prosessen for å vises på kommandokonsollen.

Hvordan gjenkjenne mulige feil når du bruker EXECV () -funksjonen

De execv () Funksjonen kommer ikke tilbake hvis den utføres vellykket. Hvis den går tilbake til koden som kalte det, har det oppstått en feil. Feilene som kan genereres av denne funksjonen er mangfoldig siden operasjonen avhenger av to forskjellige prosesser, filstier, tilgangstillatelser og så videre.

Måten å identifisere feilen er gjennom errno Global variabel. Denne variabelen er et heltall og er definert i “Errno.h ”header. Hver gang det oppstår en feil, lagres en numerisk verdi som representerer en bestemt feil i den.

Deretter ser vi på definisjonene og representative verdien av mulige feil som kan oppstå når du bruker denne funksjonen:


Vi genererer en feil i paternet.C-kode, som indikerer en ikke-eksisterende filbane til execv () funksjon. Bruk deretter Printf -funksjonen til å vise feilkoden som er hentet fra errno Variabel i konsollen:

#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
int main ()
printf ("\ n \ ni er overordnet prosess \ n");
char *arg_ptr [5];
arg_ptr [0] = "barn.c ";
arg_ptr [1] = "\ nhello fra";
arg_ptr [2] = "prosess 2";
arg_ptr [3] = null;
execv ("/home/linuxhint/ikke eksisterende.bin ", arg_ptr);
printf ("Feil: %i \ n", errno);


Som vi kan se i følgende figur, kunne ikke execv () -funksjonen finne filen med den spesifiserte banen og går derfor tilbake til overordnet prosess med verdien 2 i errno -variabelen som tilsvarer "Ingen slik fil eller katalog ” feil.

Konklusjon

I dette Linux hint Artikkel, vi forklarte hvordan vi bruker execv () funksjon på C -språket for å starte en prosess fra en annen prosess. Vi forklarte den teoretiske driften av execv () og viste hvordan man erklærer inngangsargumentene.

Vi implementerte det vi lærte i et eksempel, og viste deg hvordan du lager foreldreprogrammet og barneprosessen ved å gi argumentene fra det ene til det andre. Vi så også en spesiell seksjon der vi viser de vanligste feilene i denne funksjonen og hvordan vi kan identifisere dem ved å bruke Errno -variabelen.

Vi håper at denne artikkelen er nyttig for deg. For flere artikler om C -språket og Linux -tipsene, bruk søkemotoren på nettstedet vårt.