Section: Manual del Programador de Linux (2)
Updated: 3 septiembre 1997
Index Return to Main
Contents
int execve (const char *filename, const char *argv [], const char *envp[]);
ejecuta el programa indicado por filename.
filename debe ser bien un binario ejecutable, bien un guión
shell (shell script) comenzando con una línea de la forma
"#! intérprete [arg]". En el segundo caso, el
intérprete debe ser un nombre de camino válido para un ejecutable
que no sea él mismo un guión y que será ejecutado como
intérprete [arg] filename.
argv es un array de cadenas de argumentos pasados al nuevo
programa. envp es un array de cadenas, convencionalmente de
la forma clave=valor, que se pasan como entorno al nuevo
programa. Tanto argv como envp deben terminar en un
puntero nulo. El vector de argumentos y el entorno pueden ser
accedidos por la función "main" del programa invocado cuando se
define como int main(int argc, char *argv[], char *envp[]).
execve() no regresa en caso de éxito, y el código, datos, bss y la pila del proceso invocador se reescriben con los correspondientes del programa cargado. El programa invocado hereda el PID del proceso invocador y cualquier descriptor de fichero abierto que no se halla configurado para "cerrar en ejecución" (close on exec). Las señales pendientes del proceso invocador se limpian. Cualquier señal capturada por el proceso invocador es devuelta a su comportamiento por defecto.
Si el programa actual está bajo inspección de ptrace, se le enviará una señal SIGTRAP trás la ejecución exitosa de execve().
Si el bit "set-uid" está activo en el fichero del programa indicado por filename, se cambia el ID de usuario efectivo del proceso invocador al del propietario del fichero del programa. De igual forma, cuando el bit "set-gid" del fichero del programa está activo, se cambia el ID del grupo efectivo del proceso invocador al del grupo del fichero del programa.
Si el ejecutable es un ejecutable binario a.out enlazado dinámicamente que contiene "stubs" de bibliotecas compartidas, se llama al enlazador dinámico de Linux, ld.so(8), al comienzo de la ejecución para traer al núcleo las bibliotecas compartidas necesarias y enlazar el ejecutable con ellas.
Si el ejecutable es un ejecutable ELF enlazado dinámicamente, se usa el intérprete especificado en el segmento PT_INTERP para cargar las bibliotecas compartidas necesarias. Este intérprete es usualmente /lib/ld-linux.so.1 para los binarios enlazados con la versión 5 de la libc de Linux o /lib/ld-linux.so.2 para los binarios enlazados con la versión 2 de la libc de GNU.
En caso de éxito execve() no regresa mientras que en caso de error el valor devuelto es -1, y a la variable errno se le asigna un valor apropiado.
SVr4, SVID, X/OPEN y BSD 4.3. POSIX no documenta el significado de #! pero, en cualquier caso, es compatible. SVr4 documenta las condiciones de error adicionales EAGAIN, EINTR, ELIBACC, ENOLINK y EMULTIHOP; POSIX no documenta las condiciones de error ETXTBSY, EPERM, EFAULT, ELOOP, EIO, ENFILE, EMFILE, EINVAL, EISDIR ni ELIBBAD.
Procesos SUID y SGID no pueden ser inspeccionados con ptrace().
La longitud máxima de línea en un ejecutable del tipo #! es de 127 caracteres en la primera línea del fichero.
Linux ignora los bits SUID y SGID en los guiones shell.
(2), fork(2), execl(3), environ(5), ld.so(8)
This document was created by man2html, using
the manual pages.
Time: 06:16:21 GMT, January 22, 2005