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'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)