Llamada al sistema ejecutivo en C

Exec System Call C



La familia ejecutiva tiene muchas funciones en C. Estas funciones de C se utilizan básicamente para ejecutar un comando del sistema en un proceso separado del programa principal e imprimir la salida.

En este artículo, voy a hablar sobre la familia de funciones ejecutivas y le mostraré cómo usar cada una de estas funciones de la familia ejecutiva en C. Entonces, comencemos.







Funciones del sistema C en la familia Exec:

Las familias de funciones ejecutivas se definen en el encabezado unistd.h . Por lo tanto, debe usar este encabezado en el programa C donde desea usar estas funciones.



Las funciones ejecutivas disponibles junto con sus parámetros de función se dan a continuación:



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

Veamos qué hace cada una de estas funciones y cómo utilizarlas.





execl () Función del sistema:

En execl (), la función del sistema toma la ruta del archivo binario ejecutable (es decir, / bin / ls ) como primer y segundo argumento. Entonces, los argumentos (es decir, -lh , /hogar ) que desea pasar al ejecutable seguido de NULO . Luego, la función del sistema execl () ejecuta el comando e imprime la salida. Si ocurre algún error, execl () devuelve -1. De lo contrario, no devuelve nada.

Sintaxis:

En texecl(constante carbonizarse *sendero, constante carbonizarse *enfadado,...,NULO);

A continuación se muestra un ejemplo de la función del sistema execl ():



#incluir

En tprincipal(vacío) {
carbonizarse *binaryPath= '/ bin / ls';
carbonizarse *arg1= '-lh';
carbonizarse *arg2= '/hogar';

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

regreso 0;
}

Corrí el ls -lh / hombre comando usando la función del sistema execl (). Como puede ver, se muestra el resultado correcto.

execlp () Función del sistema:

execl () no usa el SENDERO Variable ambiental. Por lo tanto, se requiere la ruta completa del archivo ejecutable para ejecutarlo con execl (). execlp () usa la variable de entorno PATH. Por lo tanto, si un archivo o comando ejecutable está disponible en la RUTA, entonces el comando o el nombre del archivo es suficiente para ejecutarlo, no se necesita la ruta completa.

Sintaxis:

En texeclp(constante carbonizarse *expediente, constante carbonizarse *enfadado,,NULO);

Podemos reescribir el ejemplo execl () usando la función del sistema execlp () de la siguiente manera:

#incluir

En tprincipal(vacío) {
carbonizarse *programName= 'ls';
carbonizarse *arg1= '-lh';
carbonizarse *arg2= '/hogar';

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

regreso 0;
}

Solo pasé el nombre del comando ls , no el camino completo / bin / ls . Como puede ver, obtuve el mismo resultado que antes.

execv () Función del sistema:

En la función execl (), los parámetros del archivo ejecutable se pasan a la función como diferentes argumentos. Con execv (), puede pasar todos los parámetros en una matriz terminada en NULL argv . El primer elemento de la matriz debe ser la ruta del archivo ejecutable. De lo contrario, la función execv () funciona igual que la función execl ().

Sintaxis:

En texecv(constante carbonizarse *sendero, carbonizarse *constanteargv[]);

Podemos reescribir el ejemplo execl () de la siguiente manera:

#incluir

En tprincipal(vacío) {
carbonizarse *binaryPath= '/ bin / ls';
carbonizarse *argumentos[] = {binaryPath, '-lh', '/hogar',NULO};

execv(binaryPath,argumentos);

regreso 0;
}

Como puede ver, obtengo el resultado correcto.

execvp () Función del sistema:

Funciona de la misma forma que la función del sistema execv (). Pero se utiliza la variable de entorno PATH. Por lo tanto, no se requiere la ruta completa del archivo ejecutable como en execlp ().

Sintaxis:

En texecvp(constante carbonizarse *expediente, carbonizarse *constanteargv[]);

Podemos reescribir el ejemplo execv () de la siguiente manera:

#incluir

En tprincipal(vacío) {
carbonizarse *programName= 'ls';
carbonizarse *argumentos[] = {programName, '-lh', '/hogar',NULO};

execvp(programName,argumentos);

regreso 0;
}

Como puede ver, se muestra la salida correcta.

execle () Función del sistema:

Funciona igual que execl () pero puede proporcionar sus propias variables de entorno junto con él. Las variables de entorno se pasan como una matriz envp . El último elemento de la envp la matriz debe ser NULL. Todos los demás elementos contienen los pares clave-valor como cadena.

Sintaxis:

En texecle(constante carbonizarse *sendero, constante carbonizarse *enfadado,...,NULO, carbonizarse * constanteenvp[] );

A continuación se muestra un ejemplo de la función del sistema execle ():

#incluir

En tprincipal(vacío) {
carbonizarse *binaryPath= '/ bin / bash';
carbonizarse *arg1= '-c';
carbonizarse *arg2= 'echo 'Visita $ HOSTNAME:$ PORT desde su navegador.'';
carbonizarse *constanteenv[] = {'HOSTNAME = www.linuxhint.com', 'PUERTO = 8080',NULO};

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

regreso 0;
}

Pasé dos variables de entorno NOMBRE DE ANFITRIÓN y PUERTO a la función execle (). Como puede ver, puedo acceder a ellos desde el ejecutable. / bin / bash .

execve () Función del sistema:

Al igual que execle (), puede proporcionar sus propias variables de entorno junto con execve (). También puede pasar argumentos como matrices como lo hizo en execv ().

Sintaxis:

En tejecutivo(constante carbonizarse *expediente, carbonizarse *constanteargv[], carbonizarse *constanteenvp[]);

El ejemplo execle () se puede reescribir de la siguiente manera:

#incluir

En tprincipal(vacío) {
carbonizarse *binaryPath= '/ bin / bash';
carbonizarse *constanteargumentos[] = {binaryPath, '-c', 'echo 'Visita $ HOSTNAME:$ PUERTO
desde su navegador.'',NULO};
carbonizarse *constanteenv[] = {'HOSTNAME = www.linuxhint.com', 'PUERTO = 8080',NULO};

ejecutivo(binaryPath,argumentos,env);

regreso 0;
}

Como puede ver, obtenemos el mismo resultado que en el ejemplo execle ().

Entonces, así es como se usa la familia de funciones ejecutivas en C para la programación de sistemas en Linux. Gracias por leer este artículo.