Exec systemopkald i C

Exec System Call C



Exec -familien har mange funktioner i C. Disse C -funktioner bruges dybest set til at køre en systemkommando i en separat proces, som hovedprogrammet og udskriver output.

I denne artikel vil jeg tale om exec -familien af ​​funktioner og vise dig, hvordan du bruger hver enkelt af disse exec -familiefunktioner i C. Så lad os komme i gang.







C Systemfunktioner i Exec -familien:

Exec -funktionsfamilierne er defineret i overskriften unistd.h . Så du skal bruge denne header på C -programmet, hvor du vil bruge disse funktioner.



De tilgængelige exec -funktioner sammen med deres funktionsparametre er angivet nedenfor:



  • int execl (const char *path, const char *arg,…, NULL);
  • int execlp (const char *fil, const char *arg,…, NULL);
  • int execv (const char *path, char *const argv []);
  • int execvp (const char *fil, char *const argv []);
  • int execle (const char *path, const char *arg,…, NULL, char *const envp []);
  • int execve (const char *fil, char *const argv [], char *const envp []);

Lad os se, hvad hver af disse funktioner gør, og hvordan de bruges.





execl () Systemfunktion:

I execl () tager systemfunktionen stien til den eksekverbare binære fil (dvs. / bin / ls ) som det første og andet argument. Derefter argumenterne (dvs. -lh , /hjem ), som du vil videregive til den eksekverbare efterfulgt af NUL . Derefter kører execl () systemfunktionen kommandoen og udskriver output. Hvis der opstår en fejl, returnerer execl () -1. Ellers returnerer det ingenting.

Syntaks:

intexecl(konst forkælelse *sti, konst forkælelse *vred,...,NUL);

Et eksempel på execl () systemfunktionen er givet nedenfor:



#omfatte

intvigtigste(ugyldig) {
forkælelse *binær vej= ' / bin / ls';
forkælelse *arg1= '-lh';
forkælelse *arg2= '/hjem';

execl(binær vej,binær vej,arg1,arg2,NUL);

Vend tilbage 0;
}

Jeg løb ls -lh / hjem kommando ved hjælp af execl () systemfunktion. Som du kan se, vises det korrekte resultat.

execlp () Systemfunktion:

execl () bruger ikke STI miljøvariabel. Så den fulde sti til den eksekverbare fil er påkrævet for at køre den med execl (). execlp () bruger miljøvariablen PATH. Så hvis en eksekverbar fil eller kommando er tilgængelig i PATH, så er kommandoen eller filnavnet nok til at køre det, den fulde sti er ikke nødvendig.

Syntaks:

intexeclp(konst forkælelse *fil, konst forkælelse *vred,...,NUL);

Vi kan omskrive execl () -eksemplet ved hjælp af execlp () systemfunktionen som følger:

#omfatte

intvigtigste(ugyldig) {
forkælelse *programnavn= 'ls';
forkælelse *arg1= '-lh';
forkælelse *arg2= '/hjem';

execlp(programnavn,programnavn,arg1,arg2,NUL);

Vend tilbage 0;
}

Jeg har kun bestået kommandonavnet ls , ikke den fulde vej / bin / ls . Som du kan se, fik jeg det samme output som før.

execv () Systemfunktion:

I funktionen execl () overføres parametrene for den eksekverbare fil til funktionen som forskellige argumenter. Med execv () kan du videregive alle parametrene i et NULL -afsluttet array argv . Det første element i arrayet skal være stien til den eksekverbare fil. Ellers fungerer execv () -funktionen ligesom execl () -funktionen.

Syntaks:

inteksekv(konst forkælelse *sti, forkælelse *konstargv[]);

Vi kan omskrive execl () -eksemplet som følger:

#omfatte

intvigtigste(ugyldig) {
forkælelse *binær vej= ' / bin / ls';
forkælelse *args[] = {binær vej, '-lh', '/hjem',NUL};

eksekv(binær vej,args);

Vend tilbage 0;
}

Som du kan se, får jeg det korrekte output.

execvp () Systemfunktion:

Virker på samme måde som execv () systemfunktion. Men PATH -miljøvariablen bruges. Så den fulde sti til den eksekverbare fil er ikke påkrævet ligesom i execlp ().

Syntaks:

intexecvp(konst forkælelse *fil, forkælelse *konstargv[]);

Vi kan omskrive execv () -eksemplet som følger:

#omfatte

intvigtigste(ugyldig) {
forkælelse *programnavn= 'ls';
forkælelse *args[] = {programnavn, '-lh', '/hjem',NUL};

execvp(programnavn,args);

Vend tilbage 0;
}

Som du kan se, vises det korrekte output.

execle () Systemfunktion:

Virker ligesom execl (), men du kan levere dine egne miljøvariabler sammen med det. Miljøvariablerne sendes som en matrix envp . Det sidste element i envp array skal være NULL. Alle de andre elementer indeholder nøgle-værdiparene som streng.

Syntaks:

inteksecle(konst forkælelse *sti, konst forkælelse *vred,...,NUL, forkælelse * konstenvp[] );

Et eksempel på execle () systemfunktionen er givet nedenfor:

#omfatte

intvigtigste(ugyldig) {
forkælelse *binær vej= '/bin/bash';
forkælelse *arg1= '-c';
forkælelse *arg2= 'smed ud 'Besøg $ HOSTNAME:$ PORT fra din browser.'';
forkælelse *konstenv[] = {'HOSTNAME = www.linuxhint.com', 'PORT = 8080',NUL};

eksecle(binær vej,binær vej,arg1,arg2,NUL,env);

Vend tilbage 0;
}

Jeg bestod to miljøvariabler VÆRTSNAVN og HAVN til funktionen execle (). Som du kan se, kan jeg få adgang til dem fra den eksekverbare /bin/bash .

execve () Systemfunktion:

Ligesom execle () kan du angive dine egne miljøvariabler sammen med execve (). Du kan også videregive argumenter som arrays, som du gjorde i execv ().

Syntaks:

intudføre(konst forkælelse *fil, forkælelse *konstargv[], forkælelse *konstenvp[]);

Execle () -eksemplet kan omskrives som følger:

#omfatte

intvigtigste(ugyldig) {
forkælelse *binær vej= '/bin/bash';
forkælelse *konstargs[] = {binær vej, '-c', 'smed ud 'Besøg $ HOSTNAME:$ PORT
fra din browser.'',NUL};
forkælelse *konstenv[] = {'HOSTNAME = www.linuxhint.com', 'PORT = 8080',NUL};

udføre(binær vej,args,env);

Vend tilbage 0;
}

Som du kan se, får vi det samme output som i execle () -eksemplet.

Så sådan bruger du exec -funktionsfamilien i C til systemprogrammering i Linux. Tak fordi du læste denne artikel.