procesos funcion execve ejemplos comando c linux exec system-calls

ejemplos - ¿Cuál es la diferencia entre las funciones de la familia exec de llamadas de sistema como execve y execve?



funcion exec en c (7)

Idea principal

La familia de funciones exec () reemplaza la imagen de proceso existente con una nueva imagen de proceso. Esta es una marcada diferencia con respecto a la llamada del sistema fork () donde los procesos padre e hijo coexisten en la memoria.

exec () familia de funciones

int execv (const char *filename, char *const argv[])

El nombre de archivo es el archivo de la nueva imagen de proceso.

argv representa una matriz de cadenas terminadas en nulo. El último elemento de esta matriz debe ser un puntero nulo.

int execl (const char *filename, const char *arg0, …)

Igual que execv, pero los argumentos se proporcionan como una cadena individual (separada por comas) en lugar de una matriz / vector.

int execve (const char *filename, char *const argv[], char *const env[])

Igual que execv, pero permite especificar variables de entorno para una nueva imagen de proceso.

int execle (const char *filename, const char *arg0, …, char *const env[])

Igual que execl, pero permite especificar variables de entorno para una nueva imagen de proceso.

int execvp (const char *filename, char *const argv[])

Igual que la función execv, pero busca la variable de entorno estándar PATH para encontrar el nombre de archivo si el nombre de archivo no contiene una barra.

Aquí hay una lista de variables de entorno estándar:

https://www.gnu.org/software/libc/manual/html_node/Standard-Environment.html#Standard-Environment

int execlp (const char *filename, const char *arg0, …)

Igual que la función execl, excepto el hecho de que si realiza la búsqueda de nombres de archivo como la función execvp.

Nota

En un sistema Linux, si escribe env o printenv en el shell o terminal, obtendrá una lista de variables de entorno estándar.

He estado siguiendo un curso de programación de sistemas recientemente y vine a través de las llamadas de sistema exec () y execve () . Hasta ahora no puedo encontrar ninguna diferencia entre estos dos, incluso la Wikipedia no da una explicación clara, por lo que existe una diferencia entre exec () y execve () .

Y alguien, por favor, podría dar breves descripciones sobre las llamadas al sistema de la familia exec, como execl () , execv () , execle () , execvp () .


Como todas estas funciones pertenecen a la familia exec (), permítanme differentiate según extra characters con los significados,

1.exec ve ():

p: no presente => el nombre del programa que se ejecutará se tomará de la pathname de pathname

v: present => argumento se pasará como array

e: present => environment se tomará del envp argument

2.exec le ():

p: no presente => el nombre del programa que se ejecutará se tomará de la pathname de pathname

l: present => argumento pasará como list

e: present => environment se tomará del envp argument

3.exec lp ():

p: present => el nombre del programa que se ejecutará se tomará del filename de filename especificado o el sistema buscará el search for program file en la variable PATH .

l: present => argumento pasará como list

e: no presente => el entorno se tomará del entorno de la caller''s environ

4.exec vp ():

p: present => el nombre del programa que se ejecutará se tomará del filename de filename especificado o el sistema buscará el search for program file en la variable PATH .

v: present => argumento se pasará como array

e: no presente => el entorno se tomará del entorno de la caller''s environ

5.exec v ():

p: no presente => el nombre del programa que se ejecutará se tomará de la pathname de pathname

v: present => argumento se pasará como array

e: no presente => el entorno se tomará del entorno de la caller''s environ

6. exec l ():

p: no presente => el nombre del programa que se ejecutará se tomará de la pathname de pathname

l: present => argumento pasará como list

e: no presente => el entorno se tomará del entorno de la caller''s environ


Dentro de la familia de ejecutivos, hay funciones que varían ligeramente en sus capacidades y en cómo se llaman:

  1. Las funciones que contienen la letra p en sus nombres ( execvp y execlp ) aceptan un nombre de programa y buscan un programa con ese nombre en la ruta de ejecución actual; Las funciones que no contienen la p deben recibir la ruta completa del programa a ejecutar.

  2. Las funciones que contienen la letra v en sus nombres ( execv , execvp y execve) aceptan la lista de argumentos para el nuevo programa como una matriz de punteros a cadenas terminada en NULL. Las funciones que contienen la letra l ( execl , execlp y execle) aceptan la lista de argumentos utilizando el mecanismo de varargs del lenguaje varargs

  3. Las funciones que contienen la letra e en sus nombres ( execve y execle ) aceptan un argumento adicional, una matriz de variables de entorno. El argumento debe ser una matriz de punteros a cadenas de caracteres terminada en NULO. Cada cadena de caracteres debe tener el formato VARIABLE=value .

Source


Los argumentos son diferentes para estas funciones.

  • La función execl, execlp y execle requieren que cada uno de los argumentos de la línea de comando para el nuevo programa se especifique como argumentos separados.

  • Execv, execvp y execve, tenemos que crear una matriz de punteros a los argumentos, y la dirección de esta matriz es el argumento de estas tres funciones.

  • Las funciones execve, execle nos permiten pasar el puntero a una matriz de punteros a las cadenas de entorno. Las otras cuatro funciones utilizan la variable de entorno en el proceso de llamada para copiar el entorno existente al programa.

  • La letra p significa que las funciones toman un argumento de nombre de archivo y usan la variable de entorno PATH para encontrar el archivo ejecutable.
  • La letra l significa que la función toma una lista de argumentos y se excluye mutuamente con la letra v , lo que significa que toma un vector argv [].
  • La letra e significa que la función toma una matriz envp[] lugar de usar el entorno actual.

  • El nuevo programa hereda las siguientes características adicionales del proceso de llamada.

Process ID and the Parent Process ID Real user ID and Real Group ID Supplementary group IDs Process group ID Session ID Controlling terminal Time left until alarm clock Current working directory Root directory File mode creation mask File locks Process signal mask Pending signals Resource limits Values for tms_utime, tms_stime, tms_cutime, and tms_cstime.

  • La ID de usuario real y la ID de grupo real siguen siendo las mismas en todo el exec, pero las ID efectivas pueden cambiar, dependiendo del estado de la identificación de usuario establecida y los bits de identificación de grupo establecida para el archivo de programa ejecutado.

No hay una llamada al sistema exec , por lo general se usa para referirse a todas las llamadas execXX como un grupo. Todos hacen esencialmente lo mismo: cargar un programa nuevo en el proceso actual y proporcionarle argumentos y variables de entorno. Las diferencias están en cómo se encuentra el programa, cómo se especifican los argumentos y de dónde proviene el entorno.

  • Las llamadas con v en el nombre toman un parámetro de matriz para especificar la matriz argv[] del nuevo programa.

  • Las llamadas con l en el nombre toman los argumentos del nuevo programa como una lista de argumentos de longitud variable para la función en sí.

  • Las llamadas con e en el nombre toman un argumento adicional para proporcionar el entorno del nuevo programa; de lo contrario, el programa hereda el entorno del proceso actual.

  • Las llamadas con p en el nombre buscan la PATH entorno PATH para encontrar el programa si no tiene un directorio (es decir, no contiene un carácter / ). De lo contrario, el nombre del programa siempre se trata como una ruta al ejecutable.


Para responder a la primera parte de su pregunta, específicamente en el contexto de Linux, solo hay una llamada al sistema y es execve (no exec ). El resto de la llamada "familia exec" ( execl , execle , execv , execvp , etc.) son todas envolturas GLIBC para la llamada al sistema del kernel, es decir, execve .


Usa el man7.org/linux/man-pages/man3/execl.3.html y lee:

The execv(), execvp(), and execvpe() functions provide an array of pointers to null-terminated strings that represent the argument list available to the new program. The first argument, by convention, should point to the filename associated with the file being executed. The array of pointers must be terminated by a NULL pointer.

execv

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

Entonces pasas una matriz como parámetros

int execle(const char *path, const char *arg, ..., char * const envp[]);

Casi lo mismo, pero no como una matriz, sino más bien como una lista de valores (cadenas), seguida de una matriz que designa el entorno.

Aquí:

int execvp(const char *file, char *const argv[]);

Está llamando a un archivo, sin ruta, por lo que espera que ya esté en la path correcta antes de llamar.

Por último, si bien no menos importante:

int execve(const char *filename, char *const argv[], char *const envp[]);

Similar al anterior, pero ahora tiene dos matrices, para argumentos y variables de entorno.