Exec System Call en C.

Exec System Call C



La família exec té moltes funcions a C. Aquestes funcions C s'utilitzen bàsicament per executar una ordre del sistema en un procés separat que el programa principal i imprimir la sortida.

En aquest article, parlaré de la família de funcions exec i us mostraré com utilitzar cadascuna d’aquestes funcions de la família exec a C. Per tant, comencem.







Funcions del sistema C a la família Exec:

Les famílies de funcions exec es defineixen a la capçalera unistd.h . Per tant, heu d’utilitzar aquesta capçalera al programa C on vulgueu utilitzar aquestes funcions.



A continuació es detallen les funcions exec disponibles juntament amb els seus paràmetres de funció:



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

Vegem què fan cadascuna d’aquestes funcions i com s’utilitzen.





execl () Funció del sistema:

La funció del sistema execl () pren el camí del fitxer binari executable (és a dir, / bin / ls ) com a primer i segon argument. Aleshores, els arguments (és a dir, -lh , / casa ) que voleu passar a l'executable seguit de NUL . A continuació, la funció del sistema execl () executa l'ordre i imprimeix la sortida. Si es produeix algun error, execl () retorna -1. En cas contrari, no retorna res.

Sintaxi:

intexecl(const char *Camí, const char *enfadat,...,NUL);

A continuació es mostra un exemple de la funció del sistema execl ():



#incloure

intprincipal(buit) {
char *binaryPath= '/ bin / ls';
char *arg1= '-lh';
char *arg2= '/ home';

execl(binaryPath,binaryPath,arg1,arg2,NUL);

tornar 0;
}

Vaig córrer el ls -lh /home ordre mitjançant la funció del sistema execl (). Com podeu veure, es mostra el resultat correcte.

execlp () Funció del sistema:

execl () no utilitza el fitxer CAMÍ variable d'entorn. Per tant, es requereix el camí complet del fitxer executable per executar-lo amb execl (). execlp () utilitza la variable d'entorn PATH. Per tant, si hi ha disponible un fitxer o una ordre executable al PATH, l'ordre o el nom del fitxer són suficients per executar-lo, no és necessari el camí d'accés complet.

Sintaxi:

intexeclp(const char *dossier, const char *enfadat,...,NUL);

Podem reescriure l’exemple execl () mitjançant la funció del sistema execlp () de la següent manera:

#incloure

intprincipal(buit) {
char *programName= 'ls';
char *arg1= '-lh';
char *arg2= '/ home';

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

tornar 0;
}

Només he passat el nom de l'ordre ls , no el camí complet / bin / ls . Com podeu veure, he obtingut la mateixa sortida que abans.

execv () Funció del sistema:

A la funció execl (), els paràmetres del fitxer executable es passen a la funció com a arguments diferents. Amb execv (), podeu passar tots els paràmetres en una matriu finalitzada NULL argv . El primer element de la matriu ha de ser la ruta del fitxer executable. En cas contrari, la funció execv () funciona igual que la funció execl ().

Sintaxi:

intexecv(const char *Camí, char *constargv[]);

Podem reescriure l'exemple execl () de la següent manera:

#incloure

intprincipal(buit) {
char *binaryPath= '/ bin / ls';
char *args[] = {binaryPath, '-lh', '/ home',NUL};

execv(binaryPath,args);

tornar 0;
}

Com podeu veure, obtinc la sortida correcta.

Funció del sistema execvp ():

Funciona de la mateixa manera que la funció del sistema execv (). Però s’utilitza la variable d’entorn PATH. Per tant, la ruta completa del fitxer executable no és necessària igual que a execlp ().

Sintaxi:

intexecvp(const char *dossier, char *constargv[]);

Podem reescriure l'exemple execv () de la següent manera:

#incloure

intprincipal(buit) {
char *programName= 'ls';
char *args[] = {programName, '-lh', '/ home',NUL};

execvp(programName,args);

tornar 0;
}

Com podeu veure, es mostra la sortida correcta.

execle () Funció del sistema:

Funciona com execl (), però podeu proporcionar les vostres pròpies variables d'entorn. Les variables d'entorn es passen com una matriu envp . L'últim element del fitxer envp la matriu ha de ser NULA. Tots els altres elements contenen els parells clau-valor com a cadena.

Sintaxi:

intexecle(const char *Camí, const char *enfadat,...,NUL, char * constenvp[] );

A continuació es mostra un exemple de la funció del sistema execle ():

#incloure

intprincipal(buit) {
char *binaryPath= '/ bin / bash';
char *arg1= '-C';
char *arg2= 'Echo'Visiteu $ HOSTNAME:$ PORT des del vostre navegador.'';
char *constenv[] = {'HOSTNAME = www.linuxhint.com', 'PORT = 8080',NUL};

execle(binaryPath,binaryPath,arg1,arg2,NUL,env);

tornar 0;
}

He aprovat dues variables d'entorn NOM D'HOSTAL i PORT a la funció execle (). Com podeu veure, hi puc accedir des de l’executable / bin / bash .

Funció del sistema execve ():

Igual que execle (), podeu proporcionar les vostres pròpies variables d’entorn junt amb execve (). També podeu passar arguments com a matrius com ho vau fer a execv ().

Sintaxi:

intexecutar(const char *dossier, char *constargv[], char *constenvp[]);

L'exemple execle () es pot reescriure de la següent manera:

#incloure

intprincipal(buit) {
char *binaryPath= '/ bin / bash';
char *constargs[] = {binaryPath, '-C', 'Echo'Visiteu $ HOSTNAME:$ PORT
des del vostre navegador.'',NUL};
char *constenv[] = {'HOSTNAME = www.linuxhint.com', 'PORT = 8080',NUL};

executar(binaryPath,args,env);

tornar 0;
}

Com podeu veure, obtenim la mateixa sortida que a l’exemple execle ().

Per tant, és així com utilitzeu la família de funcions exec en C per a la programació del sistema a Linux. Gràcies per llegir aquest article.