GNU/Linux >> Tutoriales Linux >  >> Linux

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

No hay exec llamada al sistema:esto se usa generalmente para referirse a todos los execXX llamadas en grupo. Todos hacen esencialmente lo mismo:cargar un nuevo programa 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, tome un parámetro de matriz para especificar el argv[] matriz del nuevo programa. El final de los argumentos se indica mediante un elemento de matriz que contiene NULL .

  • Las llamadas con l en el nombre toma los argumentos del nuevo programa como una lista de argumentos de longitud variable para la función misma. El final de los argumentos se indica con un (char *)NULL argumento. Siempre debe incluir el tipo de conversión, porque NULL se permite que sea una constante entera, y las conversiones de argumentos predeterminadas cuando se llama a una función variable no la convertirán en un puntero.

  • Las llamadas con e en el nombre tome un argumento extra (o argumentos en el l caso) para proporcionar el entorno del nuevo programa; de lo contrario, el programa hereda el entorno del proceso actual. Esto se proporciona de la misma manera que el argv matriz:una matriz para execve() , argumentos separados para execle() .

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

  • FreeBSD 5.2 agregó otra variante:execvP (con mayúsculas P ). Esto es como execvp() , pero en lugar de obtener la ruta de búsqueda del PATH variable de entorno, es un parámetro explícito de la función:

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

Usa man exec 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 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 el path correcto antes de llamar.

Por último, pero 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.


Dado que todas estas funciones pertenecen a la familia exec(), déjame differentiate según extra characters con los significados,

1.execve ():

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

v :presente => el argumento se pasará como array

e:presente => el entorno se tomará de envp argument

2.execarchivo ():

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

l :presente => el argumento se pasará como list

e:presente => el entorno se tomará de envp argument

3.execlp ():

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

l :presente => el argumento se pasará como list

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

4.execvp ():

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

v :presente => el argumento se pasará como array

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

5.execv ():

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

v :presente => el argumento se pasará como array

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

6.execl ():

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

l :presente => el argumento se pasará como list

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


Linux
  1. ¿Cuál es la diferencia entre InnoDB y MyISAM?

  2. ¿Cuál es la diferencia entre una llamada de biblioteca y una llamada de sistema en Linux?

  3. ¿Cuál es la diferencia entre `su -` y `su --login`?

  4. ¿Cuál es la diferencia entre unlink y rm?

  5. ¿Cuál es la diferencia entre ruta y ruta ip?

¿Cuál es la diferencia entre Linux y Unix?

¿Cuál es la diferencia entre Shell de inicio de sesión y sin inicio de sesión?

¿Qué es un Hipervisor? ¿Cuál es la diferencia entre el tipo 1 y 2?

¿Cuál es la diferencia entre curl y Wget?

¿Qué son las llamadas al sistema Linux y las funciones de biblioteca?

¿Cuál es la diferencia entre la llamada al sistema y la llamada a la biblioteca?