Provided by:
manpages-es_1.55-8_all 
NOMBRE
execve - ejecuta un programa
SINOPSIS
#include <unistd.h>
int execve (const char *filename, const char *argv [], const char
*envp[]);
DESCRIPCIÓN
execve() 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.
La señal SIGCHLD (cuando está puesta a SIG_IGN) puede o no puede ser
reiniciada a SIG_DFL.
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.
VALOR DEVUELTO
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.
ERRORES
EACCES El fichero o el intérprete de guiones no es un fichero regular.
EACCES Se ha denegado el permiso de ejecución para el fichero o para el
intérprete de guiones o el intérprete ELF.
EACCES El sistema de ficheros está montado con la opción noexec.
EPERM El sistema de ficheros está montado con la opción nosuid, el
usuario no es el superusuario y el fichero tiene activo el bit
SUID o SGID.
EPERM El proceso está siendo ejecutado paso a paso, el usuario no es
el superusuario y el fichero tiene activo el bit SUID o SGID.
E2BIG La lista de argumentos es demasiado grande.
ENOEXEC
El ejecutable no se encuentra en un formato reconocible, es para
una arquitectura incorrecta o tiene algún otro error de formato
que impide su ejecución.
EFAULT filename apunta fuera de su espacio de direcciones accesible.
ENAMETOOLONG
filename es demasiado largo.
ENOENT El fichero filename no existe o no existe un intérprete de
guiones o un intérprete ELF, o no pudo encontrarse una
biblioteca compartida necesitada por el fichero o el intérprete.
ENOMEM No hay suficiente memoria disponible en el núcleo.
ENOTDIR
Un componente del camino filename o del camino del intérprete de
guiones o del intérprete ELF no es un directorio.
EACCES Se ha denegado el permiso de búsqueda en uno de los componentes
del camino filename o del camino del intérprete de guiones.
ELOOP Se han econtrado demasiados enlaces simbólicos al resolver
filename, el nombre del intérprete de guiones o el nombre del
intérprete ELF.
ETXTBSY
Uno o más procesos han abierto el ejecutable para escritura.
EIO Se ha producido un error de E/S.
ENFILE Se ha alcanzado el lÃmite del número total de ficheros abiertos
en el sistema.
EMFILE El proceso ya tiene abiertos el número máximo de fichero.
EINVAL El ejecutable ELF tiene más de un segmento PT_INTERP (es decir,
ha intentado especificar más de un intérprete).
EISDIR El intérprete ELF es un directorio.
ELIBBAD
El intérprete ELF no está en un formato reconocible.
CONFORME A
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.
OBSERVACIONES
Procesos SUID y SGID no pueden ser inspeccionados con ptrace().
Linux ignora los bits SUID y SGID en los guiones shell.
El resultado de montar un sistema de ficheros con la opción nosuid
varÃa entre las distintas versiones del núcleo Linux: algunas se
negarán a ejecutar ejecutables con los bits SUID/SGID cuando ésto
pudiera dar al usuario poderes que no tenÃa antes (devolviendo EPERM),
otras simplemente ignorarán los bits SUID/SGID y los ejecutarán sin
más.
La longitud máxima de lÃnea en un ejecutable del tipo #! es de 127
caracteres en la primera lÃnea del fichero.
VÉASE TAMBIÉN
chmod(2), fork(2), execl(3), environ(5), ld.so(8)