Provided by: manpages-es_1.55-10_all bug

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)