Provided by:
manpages-es_1.55-10_all 
NOMBRE
execve - ejecuta un programa
SINOPSIS
#include <unistd.h>
int execve (const char *filename, const char *argv [], const char
*envp[]);
DESCRIPCI'ON
execve() ejecuta el programa indicado por filename. filename debe ser
bien un binario ejecutable, bien un guion shell (shell script)
comenzando con una linea de la forma "#! int'erprete [arg]". En el
segundo caso, el interprete debe ser un nombre de camino valido para un
ejecutable que no sea el mismo un guion y que sera ejecutado como
int'erprete [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 funcion "main" del programa invocado cuando
se define como int main(int argc, char *argv[], char *envp[]).
execve() no regresa en caso de exito, y el codigo, 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 ejecucion" (close on exec). Las senales
pendientes del proceso invocador se limpian. Cualquier senal capturada
por el proceso invocador es devuelta a su comportamiento por defecto.
La senal SIGCHLD (cuando esta puesta a SIG_IGN) puede o no puede ser
reiniciada a SIG_DFL.
Si el programa actual esta bajo inspeccion de ptrace, se le enviara una
senal SIGTRAP tras la ejecucion exitosa de execve().
Si el bit "set-uid" esta 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 esta 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 dinamicamente
que contiene "stubs" de bibliotecas compartidas, se llama al enlazador
dinamico de Linux, ld.so(8), al comienzo de la ejecucion para traer al
nucleo las bibliotecas compartidas necesarias y enlazar el ejecutable
con ellas.
Si el ejecutable es un ejecutable ELF enlazado dinamicamente, se usa el
interprete especificado en el segmento PT_INTERP para cargar las
bibliotecas compartidas necesarias. Este interprete es usualmente
/lib/ld-linux.so.1 para los binarios enlazados con la version 5 de la
libc de Linux o /lib/ld-linux.so.2 para los binarios enlazados con la
version 2 de la libc de GNU.
VALOR DEVUELTO
En caso de exito 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 interprete de guiones no es un fichero regular.
EACCES Se ha denegado el permiso de ejecucion para el fichero o para el
interprete de guiones o el interprete ELF.
EACCES El sistema de ficheros esta montado con la opcion noexec.
EPERM El sistema de ficheros esta montado con la opcion nosuid, el
usuario no es el superusuario y el fichero tiene activo el bit
SUID o SGID.
EPERM El proceso esta 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 algun otro error de formato
que impide su ejecucion.
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 interprete de
guiones o un interprete ELF, o no pudo encontrarse una
biblioteca compartida necesitada por el fichero o el interprete.
ENOMEM No hay suficiente memoria disponible en el nucleo.
ENOTDIR
Un componente del camino filename o del camino del interprete de
guiones o del interprete ELF no es un directorio.
EACCES Se ha denegado el permiso de busqueda en uno de los componentes
del camino filename o del camino del interprete de guiones.
ELOOP Se han econtrado demasiados enlaces simbolicos al resolver
filename, el nombre del interprete de guiones o el nombre del
interprete ELF.
ETXTBSY
Uno o mas procesos han abierto el ejecutable para escritura.
EIO Se ha producido un error de E/S.
ENFILE Se ha alcanzado el limite del numero total de ficheros abiertos
en el sistema.
EMFILE El proceso ya tiene abiertos el numero maximo de fichero.
EINVAL El ejecutable ELF tiene mas de un segmento PT_INTERP (es decir,
ha intentado especificar mas de un interprete).
EISDIR El interprete ELF es un directorio.
ELIBBAD
El interprete ELF no esta 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 opcion nosuid
varia entre las distintas versiones del nucleo Linux: algunas se
negaran a ejecutar ejecutables con los bits SUID/SGID cuando esto
pudiera dar al usuario poderes que no tenia antes (devolviendo EPERM),
otras simplemente ignoraran los bits SUID/SGID y los ejecutaran sin
mas.
La longitud maxima de linea en un ejecutable del tipo #! es de 127
caracteres en la primera linea del fichero.
V'EASE TAMBI'EN
chmod(2), fork(2), execl(3), environ(5), ld.so(8)