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 elargv[]
matriz del nuevo programa. El final de los argumentos se indica mediante un elemento de matriz que contieneNULL
. -
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, porqueNULL
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 ell
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 elargv
matriz:una matriz paraexecve()
, argumentos separados paraexecle()
. -
Las llamadas con
p
en el nombre busca elPATH
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úsculasP
). Esto es comoexecvp()
, pero en lugar de obtener la ruta de búsqueda delPATH
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