Provided by: manpages-es_1.55-8_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  "#!  intrprete  [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)